我正在阅读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
,并且由于我们并行处理流,因此执行工作的一个线程对另一个线程产生的结果一无所知。因此,统计数据可能与使用 Random
和 synchronization
聚合的统计信息不同。
从随机生成的值序列应该是不相关的。
类似地,从 ThreadLocalRandom 生成的值序列应该与来自自身的值以及来自任何其他具有不同种子的 ThreadLocalRandom 的值不相关。
因此,切换到ThreadLocalRandom
应该给出与使用 Random
具有相同统计数据的值。
优点是可以避免任何同步需求。