Java ThreadLocalRandom如何减少争用?
正在查看Java 7的新功能,发现添加了以下新类: 对于并发访问,使用ThreadLocalRandom而不是 random()会减少争用,并最终提高性能 表演Java ThreadLocalRandom如何减少争用?,java,Java,正在查看Java 7的新功能,发现添加了以下新类: 对于并发访问,使用ThreadLocalRandom而不是 random()会减少争用,并最终提高性能 表演 正在研究如何实现这一点,从而减少争用和提高性能。实际上,两者的区别在于同步Math#random()可能被多个线程同时调用,因此必须同步,而ThreadLocalRandom是random的非同步版本,是线程绑定的,这意味着每个线程都有自己(更快)的分配 如果仔细查看实现,您会发现Math#random()使用java.util.ran
正在研究如何实现这一点,从而减少争用和提高性能。实际上,两者的区别在于同步
Math#random()
可能被多个线程同时调用,因此必须同步,而ThreadLocalRandom
是random
的非同步版本,是线程绑定的,这意味着每个线程都有自己(更快)的分配
如果仔细查看实现,您会发现Math#random()
使用java.util.random
的单个实例来生成随机数,其中ThreadLocalRandom
为每个线程分配一个实例,从而消除了这种意义上的争用
ThreadLocalRandom
实现并发,其中Math#random()
实现同步。来自java文档:
ThreadLocalRandom
是一个与当前线程隔离的随机数生成器。与java.lang.Math
类所使用的全局java.util.Random
生成器一样,ThreadLocalRandom
使用内部生成的种子进行初始化,该种子不可修改。如果适用,在并发程序中使用ThreadLocalRandom
而不是共享Random
对象通常会遇到更少的开销和争用
ThreadLocalRandom
通过ThreadLocal
用法实现并发:
private static final ThreadLocal<ThreadLocalRandom> localRandom =
new ThreadLocal<ThreadLocalRandom>() {
protected ThreadLocalRandom initialValue() {
return new ThreadLocalRandom();
}
};
下面是已同步的initRNG()
:
Math.random()
已同步。源代码在JDK安装中可用。完全是猜测,但我打赌Math.random()
必须同步以确保两个线程不会获得相同的随机数ThreadLocalRandom
,顾名思义,它不需要同步。@SotiriosDelimanolis-Math.random()
不是同步的
,而是randomNumberGenerator
初始化方法initRNG
是同步的
在JVM的整个生命周期中只调用一次。你要找的是有点难以解释:)这甚至是第一次增加了成本。谢谢你的回答,那么每个线程有一个RandomNumberGenerator在“这个数字有多随机?”方面会有什么不同呢?谢谢你的回答,我只是想知道一件事,现在,如果我们每个线程都有RandomNumberGenerator,那么它在伪随机数生成方面会有什么不同呢???@SachinThapa据我所知,这两种方法都提供了相等的随机性度量。
public static double random() {
if (randomNumberGenerator == null) initRNG();
return randomNumberGenerator.nextDouble();
}
private static synchronized void initRNG() {
if (randomNumberGenerator == null)
randomNumberGenerator = new Random();
}