threadlocalrandom.current()可完全规避多线程下random的竞争问题,因其为每个线程提供独立实例、无共享状态、无需同步;random因原子种子cas更新导致高并发争用和性能瓶颈。

使用 ThreadLocalRandom.current() 可以完全规避多线程下 Random 的竞争问题,因为它为每个线程提供独立的随机数生成器实例,不共享状态,无需同步。
为什么 Random 在多线程下存在竞争
Random 内部维护一个原子性种子(AtomicLong seed),每次生成随机数都要先 CAS 更新种子值。高并发时多个线程频繁争用同一 CAS 操作,会导致大量失败重试,显著降低性能,甚至成为瓶颈。
ThreadLocalRandom 是如何解决的
ThreadLocalRandom 不依赖全局种子,而是:
- 每个线程首次调用
current()时,基于当前线程的threadLocalRandomSeed和系统纳秒时间初始化专属种子; - 后续操作只读写本线程栈或线程局部变量,无共享状态;
- 所有方法(如
nextInt()、nextDouble())都是无锁的,纯本地计算。
正确使用方式与注意事项
直接调用静态方法即可,无需创建实例,也不应缓存或共享返回值:
- ✅ 正确:
int n = ThreadLocalRandom.current().nextInt(100); - ❌ 错误:
ThreadLocalRandom rnd = ThreadLocalRandom.current();(缓存后在其他线程复用会出错) - ❌ 错误:将
ThreadLocalRandom实例作为成员变量跨线程传递 - ⚠️ 注意:它不支持设置自定义种子(
setSeed()被禁用),如需可重现序列,请仍用Random并做好线程隔离(如ThreadLocal<random></random>)。
性能对比示例(简要说明)
在 16 线程循环生成 100 万个随机数的压测中:
- 共享单个
Random实例:耗时约 350–500ms(CAS 冲突严重); - 每个线程持有一个
Random(ThreadLocal<random></random>):约 80–100ms; -
ThreadLocalRandom.current():稳定在 40–60ms,且代码更简洁。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











