随机类线程安全吗?

Shc*_*ein 106 java random multithreading thread-safety

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

Pet*_*rey 63

它是线程安全的,因为它在多线程使用时仍会生成随机数.

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

我不会写你的程序来要求这样的保证,特别是因为你无法确定nextInt()将被调用的顺序.

  • Java 7文档中添加了一个保证:"java.util.Random的实例是线程安全的".http://docs.oracle.com/javase/7/docs/api/java/util/Random.html (68认同)

igg*_*ran 23

它是线程安全的,虽然并非总是如此.

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


Vin*_*rat 8

根据文档,Math.random()保证多线程使用它是安全的.但是Random类没有.我会假设你必须自己同步.


Buh*_*ndi 7

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


sey*_*hni 5

如上所述,它是线程保存,但java.util.concurrent.ThreadLocalRandom根据这篇文章(链接死)使用可能是明智的.ThreadLocalRandom也是Random的子类,因此它向后兼容.

文章链接不同的随机类的比较分析结果:java.util.Random,java.util.concurrent.ThreadLocalRandomjava.lang.ThreadLocal<java.util.Random>.结果显示,ThreadLocalRandom的使用效率最高,其次是ThreadLocal和性能最差的Random本身.