ThreadLocalRandom并发随机数原理
请解释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的随机任务窃取也使用类似机制。