ThreadlocalRandom和随机

时间:2016-06-03 05:33:52

标签: java multithreading java-8

我正在阅读Richard Warburton的一本java 8书,并对并行流的随机数生成有疑问。这是他提供的两个骰子投掷模拟示例:

public Map<Integer, Double> parallelDiceRolls(){
    double fraction = 1.0/N;
    return IntStream.range(0, N)
                     .parallel()
                     .mapToObj(twoDiceThrows())
                     .collect(groupingby(side -> side, 
                               summingDouble(n -> fracton));

我的问题是twoDiceThrow功能。后来他给出了 sketch

private int twoDiceThrow(ThreadLocalRandom random){
    int firstThrow = random.nextInt(1, 7);
    int secindThrow = random.nextInt(1, 7);
    return firstThrow + secondThrow;
}

这里的问题是关于ThreadLocalRandom。它不会影响统计数据吗?我的意思是ThreadLocalRandom被限制在Thread,因为我们并行处理我们的流,所以执行该工作的一个线程对另一个产生的结果一无所知。因此,统计信息可能与使用Randomsynchronization汇总的统计信息不同。

1 个答案:

答案 0 :(得分:4)

从Random生成的值序列应该是不相关的。

类似地,从ThreadLocalRandom生成的值序列应与来自其自身的值以及来自具有不同种子的任何其他ThreadLocalRandom的值不相关。

因此,切换到ThreadLocalRandom时,应使用与使用Random相同的统计信息给出值。

优点是您可以避免同步。