java - ThreadlocalRandom 和 just Random

标签 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 函数的。后来他给出了它的草图:

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

这里的问题是关于ThreadLocalRandom的。这不会影响统计吗?我的意思是 ThreadLocalRandom 仅限于 Thread,并且由于我们并行处理流,执行该工作的一个线程对另一个线程产生的结果一无所知。因此,统计数据可能与使用随机同步聚合的统计数据不同。

最佳答案

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

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

因此,切换到 ThreadLocalRandom 应该给出与使用 Random 具有相同统计数据的值。

优点是您无需进行任何同步。

关于java - ThreadlocalRandom 和 just Random,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37606634/

相关文章:

java - 创建/排序 List<X>,其值的顺序与 List<Y> 中的顺序相同

java - 如何通过 for 循环在 java 中增加 BigDecimal?

java - 并行阶乘计算直到给定数字的所有元素

c++ - 将 future 与 boost::asio 结合使用

java - 是否可以仅同步 java 流中的终端方法调用?

java - 访问涉及嵌套私有(private)方法的重写函数的公共(public)变量

java - 如何在 linux 上从 rest 服务执行 sh 文件

java - HashMap 上的双重迭代具有对称结果(跳过冗余情况)

java - 在 Linux 上运行 Selenium 时出现异常 - 'Driver version unknown' 错误

java - 多线程之间的对象共享