Is Random class thread safe?
在多个线程之间共享
从某种意义上说,它是线程安全的,当多个线程使用时,它仍然会生成随机数。
Sun/OracleJVM实现使用synchronized和atomiclong-as-seed来提高线程间的一致性。但文档中的所有平台似乎都不能保证这一点。
我不会写你的程序要求这样的保证,特别是当你不能确定调用
它是线程安全的,尽管它并不总是。
请参阅http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6362070了解更多详细信息。
根据文档,math.random()保证多线程使用它是安全的。但随机类没有。我假设你必须自己同步。
是的,随机是线程安全的。
如前所述,它是线程节省,但根据本文(link dead),使用
The article linked compared profiling results of the different Random
classes:java.util.Random ,java.util.concurrent.ThreadLocalRandom
andjava.lang.ThreadLocal . The results showed,
that the usage of ThreadLocalRandom is most performant, followed by
ThreadLocal and worst performing Random itself.
没有理由多个线程不能全部使用相同的随机对象。但是,由于类不是显式线程安全的,并且通过种子维护一个伪随机数序列。多个线程可能以相同的随机数结束。最好为每个线程创建多个Random,并以不同的方式对其进行种子设定。
编辑:我刚刚注意到Sun实现使用Atomiclong,所以我想这是线程安全的(正如Peter Lawrey(+1))。
edit2:openjdk还使用atomiclong作为种子。正如其他人所说,尽管依靠这一点仍然不好。
下面是我如何在不假设随机变量使用原子变量的情况下处理这个问题。如果
1 2 3 4 5 6 7 8 9 10 11 12 | /** * 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()); } }; |
没有为一个实例设置