我正在寻找在多个线程中使用(种子)Random
对象的方法,并且javadocs将我指向 ThreadLocalRandom
,它看起来很棒,但我无法设置种子,因此无法确保不同线程或运行之间的一致性。是否有使用ThreadLocalRandom
的任何实际原因,或者是否可以执行以下操作:
// Pass returned ThreadLocal object to all threads which need it
public static ThreadLocal<Random> threadRandom(final long seed) {
return new ThreadLocal<Random>(){
@Override
protected Random initialValue() {
return new Random(seed);
}
};
}
最佳答案
您可以简单地使用Random
,只需确保仅在单个线程中访问每个Random
对象。Random
是Vector
之类的古老类,它不必要地高度同步。他们可能想炫耀Java的线程支持,因为那时这很重要。同样,Java主要旨在运行在大多数具有单个处理器的消费类PC上,因此同步不会像今天在多处理器上那样影响扩展性。
现在一个明显的答案是提供Random
的非线程安全版本,就像提供threadt-fasfae ArrayList
替代Vector
一样。那没有发生,相反,我们得到了ThreadLocalRandom
。这有点奇怪,不确定其背后的动机是什么。在java8中,进一步优化了ThreadLocalRandom
以直接在Thread
对象中的某些int字段上进行操作。