我应该更喜欢ThreadLocalRandom而不是ThreadLocal<Random>吗?

2022-09-02 22:28:09

我希望在多个线程中使用(种子化)对象,javadocs向我指出了ThreadLocalRandom,它看起来很棒,除了我无法设置种子,所以我无法确保不同线程或运行之间的一致性。是否有任何实际理由使用,或者是否可以接受执行以下操作:RandomThreadLocalRandom

// 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);
        }
    };
}

答案 1

您可以简单地使用 ,只需确保每个对象仅在单个线程中访问即可。RandomRandom

Random,作为一个像 这样的古老类,是不必要的高度同步。他们可能想炫耀Java的线程支持,因为当时这是一件大事。此外,Java主要用于在消费类PC上运行,这些PC大多具有单个处理器,因此同步不会像今天在多处理器上那样影响扩展。Vector

现在一个显而易见的答案是提供线程不安全的版本,就像提供 thread-unsfae 作为 的替代方法一样。这并没有发生,相反,我们得到了.这有点奇怪,不知道这背后的动机是什么。在java8中,进一步优化为直接对对象中的某些int字段进行操作。RandomArrayListVectorThreadLocalRandomThreadLocalRandomThread


答案 2

ThreadLocalRandom的代码似乎无论如何都是作为一个实现的(不完全像你所说的那样,但可能足够接近)。我认为你所拥有的会很棒。ThreadLocal


推荐