直接调用 threadlocalrandom.current().nextint() 是高效做法,关键在于避免静态缓存导致线程共享实例而丧失隔离性,应每次调用或提取为局部变量,forkjoinpool 中子任务自动获得专属实例。

直接调用 ThreadLocalRandom.current().nextInt() 是高效做法,但想进一步提升多线程随机数生成效率,关键不在“怎么调用”,而在于“怎么避免踩坑”和“怎么适配高频场景”。真正拖慢性能的,往往是误用和边界细节。
每次必须调用 current(),禁用静态缓存
最常见也是最危险的低效写法是把 ThreadLocalRandom.current() 结果缓存在 static final 字段里:
private static final ThreadLocalRandom RANDOM = ThreadLocalRandom.current();
这会让所有线程共享初始化那一刻的单个实例,彻底失去线程隔离——种子不独立、序列全一样、竞争照旧,性能反而比 Random 还差。
✅ 正确做法: 每次需要时都写完整调用:ThreadLocalRandom.current().nextInt(1, 101)
或在循环/高频路径中提取为局部变量(非 static):
ThreadLocalRandom r = ThreadLocalRandom.current();<br> for (int i = 0; i int n = r.nextInt(1, 101);<br> }
优先使用带边界的 nextInt(origin, bound)
避免手算偏移和额外运算,减少出错与开销:
-
nextInt(1, 101)明确表示 [1, 100],语义清晰、边界安全 -
nextInt(100) + 1多一次加法,且易错(比如写成+2或漏加) - bound 必须严格大于 origin,否则立即抛
IllegalArgumentException,不静默容错
避开需要可重现随机序列的场景
ThreadLocalRandom 的种子由系统安全随机数初始化,不可外部设定。如果你需要:
- 单元测试中固定输出
- 游戏逻辑回放
- 分布式哈希一致种子
- 算法调试复现某次结果
那就不能用它——该换回 new Random(seed) 或 SecureRandom,并确保单线程使用。
并行流中可直接安全使用
无需额外同步或包装,天然适配函数式并发:
int[] arr = IntStream.range(0, 10000)<br> .parallel()<br> .map(i -> ThreadLocalRandom.current().nextInt(0, 100))<br> .toArray();
每个 fork/join 子任务自动获得本线程专属实例,无竞争、无锁、无自旋。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











