SplittableRandom 为什么适合并行任务?这篇用 1 到 8 个线程的吞吐、5 次运行的可复现性、以及误共用实例时的重复数值,把「分裂」的价值量出来(算法清单与速度对比见上一篇)。
线程 共享一个 Random ThreadLocalRandom每线程自己的 SplittableRandom(总吞吐,百万次 nextLong / 秒;每线程各 2000 万次) 1 58 1289 1549 2 18 2465 3086 4 6 4836 5888 8 2 7120 8339
split() 出来的 SplittableRandom 蒙特卡洛 π:5 次运行落在圆内的点数 = [31416145, 31416145, 31416145, 31416145, 31416145] → 5 次完全相同 ThreadLocalRandom 蒙特卡洛 π:5 次运行落在圆内的点数 = [31417628, 31414098, 31412537, 31417972, 31418240] → 5 次互不相同(不可复现) 共享一个 new Random(7) 蒙特卡洛 π:5 次运行落在圆内的点数 = [31417937, 31417645, 31416853, 31420609, 31419323] → 5 次互不相同(不可复现)
两个线程共用同一个 SplittableRandom:20 次运行里,两个线程拿到相同数值的运行有 20 次,重复数值共 3565142 个 两个线程各用 split() 出来的:20 次运行里,两个线程拿到相同数值的运行有 0 次,重复数值共 0 个