【发布时间】:2013-04-02 13:28:48
【问题描述】:
我希望在多个线程中使用(种子)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在线程之间共享一个Random对象的文档是一个糟糕的主意。我只想控制正在使用的随机对象的种子,以便行为一致且可重复。 -
您可以通过反射注入种子(将初始化设置为 false,调用 setSeed 并将初始化设置回 true)。
-
通常情况下,在使用多个线程时不存在一致性。您的解决方案很好,只是比
ThreadLocalRandom慢一点,尤其是在JDK8 中。
标签: java random concurrency