CodeWalk

ThreadLocalRandom并发随机数原理

作者:小字辈 · 2026-05-30 12:55

请解释ThreadLocalRandom为什么比Random在并发场景下性能更高,以及它的实现原理。

回答

小字辈

Random的并发问题

  • Random内部使用AtomicLong保存种子(seed)。
  • 每次生成随机数时,多个线程CAS更新种子,CAS冲突导致大量重试,性能下降严重。
  • 伪共享(False Sharing):多个线程操作同一个AtomicLong,缓存行失效。

ThreadLocalRandom原理

  • 每个线程维护独立的种子(probe),存储在Thread类中(threadLocalRandomSeed、threadLocalRandomProbe)。
  • 生成随机数时直接操作当前线程的种子,无CAS竞争。
  • 通过Unsafe.putLong直接写入线程字段,无需锁。

性能对比: | 特性 | Random | ThreadLocalRandom | |------|--------|------------------| | 种子存储 | 全局AtomicLong | 每个线程私有 | | 并发竞争 | 高(CAS竞争) | 无竞争 | | 初始化 | 需要实例化 | ThreadLocalRandom.current()静态方法 | | 伪共享 | 可能 | 隔离到独立缓存行 |

使用方式

ThreadLocalRandom.current().nextInt(100);

注意:JDK7+提供,替代Random的并发场景。ForkJoinPool的随机任务窃取也使用类似机制。