1

正在浏览 Java 7 的新特性,发现添加了这个新类:

对于并发访问,使用 ThreadLocalRandom 而不是 Math.random() 可以减少争用,最终获得更好的性能。

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

4

2 回答 2

3

实际上,两者之间的区别在于同步。Math#random()可能被多个线程同时调用,因此必须同步,而ThreadLocalRandom它的非同步版本Random是线程绑定的,这意味着每个线程都有自己的(更快的)分配。

如果您仔细查看实现,您会发现它Math#random()使用单个实例java.util.Random来生成随机数,其中ThreadLocalRandom为每个线程分配一个实例,从而消除这种意义上的争用。

ThreadLocalRandom在实现同步的地方实现并发Math#random()

于 2013-10-21T18:15:01.900 回答
0

来自 java 文档:

ThreadLocalRandom是一个与当前线程隔离的随机数生成器。与类使用的全局java.util.Random生成器一样java.lang.Math,aThreadLocalRandom使用内部生成的初始化,seed否则可能不会被修改。如果适用,在并发程序中使用ThreadLocalRandom而不是共享Random对象通常会遇到更少的开销和争用。

ThreadLocalRandomThreadLocal从使用中实现并发:

    private static final ThreadLocal<ThreadLocalRandom> localRandom =
             new ThreadLocal<ThreadLocalRandom>() {
                 protected ThreadLocalRandom initialValue() {
                     return new ThreadLocalRandom();               
             }
   };

另一方面Math.random()使用synchronize限制并行性。来自文档:

此方法已正确同步,以允许多个线程正确使用。

这是代码:

public static double random() {
    if (randomNumberGenerator == null) initRNG();
    return randomNumberGenerator.nextDouble();
}

这是synchronized initRNG()

private static synchronized void initRNG() {
         if (randomNumberGenerator == null)
             randomNumberGenerator = new Random();
     }
于 2013-10-21T19:07:21.357 回答