【发布时间】:2015-06-24 06:36:38
【问题描述】:
出于某种原因,我曾经认为java.util.Random 是线程不安全的,a-la HashMap 或BitSet,而Math.random() 被实现为使用synchronized 块包装对Random 的访问,或ThreadLocalRandom.current().nextDouble()。
事实上,java.util.Random is thread-safe(通过原子)。因此得出结论:即使我需要在单个线程中进行一些随机输入,使用ThreadLocalRandom 也是有意义的,因为内部没有原子读写,编译为锁定指令并发出内存屏障。
此外,由于 Java 8,ThreadLocalRandom 本质上是一个单例,它的状态保存在 java.lang.Thread 类的某些字段中。因此方法ThreadLocalRandom.current() 不是对ThreadLocalMap 的访问,而只是一个静态字段读取,即。 e.很便宜。
我有两个问题:
从计算机科学的角度来看,是几个线性同余随机发生器的输出(以
ThreadLocalRandoms 的方式初始化)与单个线性同余随机发生器(@ 987654338@实例)?如果第一个问题的答案是肯定的,是否有任何理由编写构造
new Random()(无种子)而不是ThreadLocalRandom.current(),永远? em>
更新。我认为像ThreadLocalRandom.current().ints().parallel().collect(...) 这样的调用可能不正确,因为线程的随机生成器状态可能未在ForkJoinPool 工作线程中初始化,但似乎ThreadLocalRandom 覆盖了方法ints()、longs() 和doubles(),使得以上结构正确。
【问题讨论】:
-
你不能用 ThreadLocalRandom 写stackoverflow.com/questions/15182496/…。
-
@immibis 好吧,这意味着唯一的情况——当我需要重现一些随机数序列时
-
@immibis 然而,问题是关于具体结构
new Random(),即。 e.没有种子。这个问题是开放的。 -