随机类线程安全吗?

在多个线程之间共享Random类的一个实例是否有效? 并从多个线程中调用nextInt(int)

这是线程安全的,因为它在multithreading使用时仍然会产生随机数。

Sun / Oracle JVM实现使用synchronized和AtomicLong作为种子来提高跨线程的一致性。 但在文档中的所有平台上似乎都没有保证。

我不会写你的程序来要求这样的保证,尤其是因为你不能确定nextInt()调用顺序。

这是线程安全的,虽然并不总是。

有关更多详细信息,请参阅http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6362070

是的,随机是线程安全的。 nextInt()方法调用使用AtomicLong seed, nextseed的protected next(int)方法AtomicLong seed, nextseed (atomic long)生成下一个种子。 AtomicLong用于种子生成时的线程安全性。

根据文档, Math.random()保证multithreading使用是安全的。 但是随机类没有。 我会假设你必须自己同步。

没有理由多个线程不能全部使用相同的随机。 但是,由于该类不是明确的线程安全的,并通过种子维护一个伪随机数序列。 多个线程可能以相同的随机数字结束。 为每个线程创build多个Randoms并以不同的方式对它们进行种子更好。

编辑 :我刚才注意到,太阳实施使用AtomicLong,所以我想这是线程安全的(也由彼得·劳里(+1)指出)。

EDIT2 :OpenJDK也使用AtomicLong作为种子。 正如其他人所说,依靠这一点仍然不好。

下面是我如何处理这个问题,而不是假设Random使用primefacesvariables。 如果currentTime * thread id在将来会有相当的一段时间,它仍然可以随机地发生冲突,但这对于我的需求来说已经足够稀less了。 为了真正避免碰撞的可能性,您可以让每个请求等待一个唯一的时钟时间戳。

 /** * Thread-specific random number generators. Each is seeded with the thread * ID, so the sequence of pseudo-random numbers are unique between threads. */ private static ThreadLocal<Random> random = new ThreadLocal<Random>() { @Override protected Random initialValue() { return new Random( System.currentTimeMillis() * Thread.currentThread().getId()); } }; 

Random类没有设置为一个实例在多个线程中使用。 当然,如果你这样做的话,你可能会增加不可预测的可能性,接近随机数。 但是由于它是一个伪随机生成器,我不明白你为什么需要共享一个实例。 有更具体的要求吗?

如上所述,它是线程保存,但根据本文使用java.util.concurrent.ThreadLocalRandom可能是明智的。 ThreadLocalRandom也是Random的一个子类,所以它是向后兼容的。