Java ThreadLocalRandom如何减少争用?

Java ThreadLocalRandom如何减少争用?,java,Java,正在查看Java 7的新功能,发现添加了以下新类: 对于并发访问,使用ThreadLocalRandom而不是 random()会减少争用,并最终提高性能 表演 正在研究如何实现这一点,从而减少争用和提高性能。实际上,两者的区别在于同步Math#random()可能被多个线程同时调用,因此必须同步,而ThreadLocalRandom是random的非同步版本,是线程绑定的,这意味着每个线程都有自己(更快)的分配 如果仔细查看实现,您会发现Math#random()使用java.util.ran

正在查看Java 7的新功能,发现添加了以下新类:

对于并发访问,使用ThreadLocalRandom而不是 random()会减少争用,并最终提高性能 表演


正在研究如何实现这一点,从而减少争用和提高性能。

实际上,两者的区别在于同步
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();
     }