从Java 8开始,有什么理由写“new Random()”吗?
出于某种原因,我曾经认为这是线程不安全的,a-la或,并且实现为用块或.java.util.Random
HashMap
BitSet
Math.random()
Random
synchronized
ThreadLocalRandom.current().nextDouble()
实际上,事实证明java.util.Random
是线程安全的(通过原子)。因此,结论是:即使我需要在单个线程中进行一些随机输入,使用也是有意义的,因为内部没有原子读取和写入,编译为锁定指令并发出内存屏障。ThreadLocalRandom
此外,由于Java 8本质上是一个单例,因此其状态保存在类的某些字段中。因此,方法不是访问,而只是静态字段读取,即非常便宜。ThreadLocalRandom
java.lang.Thread
ThreadLocalRandom.current()
ThreadLocalMap
我有两个问题:
从计算机科学的角度来看,几个线性同余随机生成器(初始化方式为s)的输出是否与单个线性同余随机生成器(实例)的输出是相同的“随机”?
ThreadLocalRandom
java.util.Random
如果第一个问题的答案是肯定的,那么是否有任何理由编写构造(没有种子)而不是,曾经?
new Random()
ThreadLocalRandom.current()
更新。我认为像这样的调用可能是不正确的,因为Thread的随机生成器状态可能没有在工作线程中初始化,但似乎覆盖了方法,并且,使上述构造正确。ThreadLocalRandom.current().ints().parallel().collect(...)
ForkJoinPool
ThreadLocalRandom
ints()
longs()
doubles()