随机类线程安全吗?
在多个线程之间共享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的一个子类,所以它是向后兼容的。