0

0

Java中的Random类与ThreadLocalRandom区别_多线程随机数优化

P粉602998670

P粉602998670

发布时间:2026-03-03 10:41:32

|

268人浏览过

|

来源于php中文网

原创

java中的random类与threadlocalrandom区别_多线程随机数优化

ThreadLocalRandom 比 Random 快,但不能直接替换

多线程下用 Random 生成随机数会竞争同一把锁(seed 更新的 CAS 或 synchronized),性能掉得明显;ThreadLocalRandom 每个线程持有一份独立实例,完全无锁。但它的设计不是为了“替代” Random,而是专用于多线程场景——它不支持设置种子(setSeed())、不能序列化、也不能通过 new ThreadLocalRandom() 实例化。

  • 必须用静态工厂方法获取:ThreadLocalRandom.current()
  • 只应在多线程环境(如 ForkJoinPool、Servlet 容器、CompletableFuture)中使用;单线程反复调用 current() 反而比复用一个 Random 实例慢(有线程局部变量查找开销)
  • 若需可重现的随机序列(比如测试、游戏存档),只能用 RandomThreadLocalRandom 不提供 setSeed()

并发环境下 new Random() 是错的

很多人以为“每个线程 new 一个 Random”就安全了,其实不对——Random 的默认构造函数会读取系统时间 + AtomicLong 做种子,高并发下大量线程几乎同时初始化,很可能得到相同种子,从而产出完全一样的随机数序列。

  • 错误写法:new Random() 放在循环或线程入口里
  • 正确做法:要么用 ThreadLocalRandom.current(),要么用带强熵种子的 new Random(secureSeed)(比如从 SecureRandom 获取一次种子)
  • 注意 SecureRandom 本身有性能开销,不适合高频调用,仅适合初始化种子

nextInt() / nextLong() 在 ThreadLocalRandom 中行为一致但不可预测

ThreadLocalRandomnextInt(int bound)nextLong(long bound)Random 接口一致,都生成 [0, bound) 区间整数。但内部实现不同:它不依赖共享 seed,而是基于线程本地的 LCG(线性同余生成器)+ 一些位运算混洗,所以输出序列无法跨线程对齐或复现。

MyMap AI
MyMap AI

使用AI将想法转化为图表

下载
  • 不要试图用 ThreadLocalRandom 做需要确定性结果的逻辑(比如分布式任务分片时按随机数路由,又要求各节点结果一致)
  • 如果 bound 是 2 的幂,ThreadLocalRandom 会走快速路径(位与操作),比 Random 略快;否则仍需循环重试避免偏移,这点两者一样
  • 边界值 bug 风险低,但要注意:当 bound 时两者都抛 <code>IllegalArgumentException,别漏判

Spring 或 Tomcat 环境下别在 Bean 里注入 Random 实例

Spring 默认单例 Bean,如果在类字段里声明 private final Random random = new Random();,这个实例会被所有请求线程共享,立刻退化为锁竞争场景。Tomcat 的 HttpServlet 实例也类似——不是每次请求新建对象。

立即学习Java免费学习笔记(深入)”;

  • 解决方案一:字段改为 ThreadLocalRandom.current() 调用(推荐)
  • 解决方案二:用 @Scope("prototype") + 构造注入,但增加 GC 压力且不易管控生命周期
  • 切记:不要用 static Random,这是最常见也最隐蔽的并发陷阱之一

真正难处理的是那些既要随机性、又要可重现、还要跨服务一致的场景——这时候连 ThreadLocalRandomRandom 都不够用,得引入外部种子分发或哈希派生逻辑,而不是靠 JDK 内置随机器硬扛。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
什么是分布式
什么是分布式

分布式是一种计算和数据处理的方式,将计算任务或数据分散到多个计算机或节点中进行处理。本专题为大家提供分布式相关的文章、下载、课程内容,供大家免费下载体验。

402

2023.08.11

分布式和微服务的区别
分布式和微服务的区别

分布式和微服务的区别在定义和概念、设计思想、粒度和复杂性、服务边界和自治性、技术栈和部署方式等。本专题为大家提供分布式和微服务相关的文章、下载、课程内容,供大家免费下载体验。

249

2023.10.07

servlet生命周期
servlet生命周期

Servlet生命周期是指Servlet从创建到销毁的整个过程。本专题为大家提供servlet生命周期的各类文章,大家可以免费体验。

390

2023.08.08

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

910

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

598

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

294

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

210

2025.08.29

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1770

2023.10.19

Swift iOS架构设计与MVVM模式实战
Swift iOS架构设计与MVVM模式实战

本专题聚焦 Swift 在 iOS 应用架构设计中的实践,系统讲解 MVVM 模式的核心思想、数据绑定机制、模块拆分策略以及组件化开发方法。内容涵盖网络层封装、状态管理、依赖注入与性能优化技巧。通过完整项目案例,帮助开发者构建结构清晰、可维护性强的 iOS 应用架构体系。

0

2026.03.03

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 4.1万人学习

C# 教程
C# 教程

共94课时 | 10.6万人学习

Java 教程
Java 教程

共578课时 | 76.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号