ThreadLocalRandom在JDK 17和更高版本中(最高为JDK 21):

@Override
public int nextInt(int bound) {
  return super.nextInt(bound);
}

@Override
public int nextInt(int origin, int bound) {
  return super.nextInt(origin, bound);
}

ThreadLocalRandom中的方法nextXXX直接使用超级(随机)方法实现.通过这种方式,我猜想对于这些方法,ThreadLocalRandom不再是"ThreadLocal".

我还判断了JDK8中ThreadLocalRandom的相同方法,如:

public int nextInt(int bound) {
  if (bound <= 0)
    throw new IllegalArgumentException(BadBound);
  int r = mix32(nextSeed());
  int m = bound - 1;
  if ((bound & m) == 0) // power of two
    r &= m;
  else { // reject over-represented candidates
    for (int u = r >>> 1;
         u + m - (r = u % bound) < 0;
         u = mix32(nextSeed()) >>> 1)
      ;
  }
  return r;
}

我的问题是,那些nextXXX直接在JDK17中使用super.nextXXX()实现的意义是什么(甚至第一个版本都来自较早的JDK版本,我没有证明这是合理的),这使得ThreadLocalRandom只是一个纯粹的Random.

推荐答案

JEP 356建议统一各种随机数生成器.它指出,RandomThreadLocalRandom中的算法足够相似,可以统一它们.

方法ThreadLocalRandom.nextInt(bound)ThreadLocalRandom.nextInt(origin, bound)仍然存在是因为这些方法的JavaDoc不同于Random.nextInt(bound)Random.nextInt(origin, bound)的JavaDoc.

在内部,Random中的方法使用next(int)和/或nextInt(),这两个都被ThreadLocalRandom覆盖.这意味着即使ThreadLocalRandom中的表面实现消失了,ThreadLocalRandom仍然是真正的ThreadLocalRandom.

Java相关问答推荐

具有额外列的Hibert多对多关系在添加关系时返回NonUniqueHealthExcellent

Android视图覆盖不阻止点击它后面的控件

无法找到符号错误—Java—封装

如何在SystemiccationRetryListenerSupport中获得类级别的spring retryable annotation中指定的标签?

Jooq外键关系

Jakarta CDI强制bean构造/注册遗留事件侦听器

无法了解Java线程所消耗的时间

安装Java Jar应用程序的Install4j遇到ClassNotFoundException的运行时错误

如何在ApachePOI中将图像添加到工作表的页眉?

生成桥方法以解决具有相同擦除的冲突方法

如何让JVM在SIGSEGV崩溃后快速退出?

如何在antlr4中跳过所有反斜杠-换行符而保留换行符?

有效的公式或值列表必须少于或等于255个字符

当构造函数创建一个新实例时,Java为什么需要&new";

如何在列表(链表)中插入一个新 node (作为prelast)

如何生成指定范围内的11位序列号?

记录是类的语法糖吗?

当我将JTextField的getText函数与相等的String进行比较时;t返回true

使用Java线程进行并行编程

在外部类和内部类之间,当调用外部类内部或外部的主方法时,它们的静态初始化程序的运行顺序不同