【笔记】Java并发编程之美-Java并发包中ThreadLocalRandom类原理剖析

本文探讨了Java中Random类在多线程环境下的性能问题,指出其由于原子变量更新导致的并发瓶颈。然后介绍了ThreadLocalRandom的实现原理,它通过线程局部变量threadLocalRandomSeed避免了并发冲突,提升了效率。ThreadLocalRandom的nextInt方法直接基于线程级别的种子计算,确保了高效且独立的随机数生成。
摘要由CSDN通过智能技术生成
Random类及其局限性

每个Random实例里都有一个原子性的种子变量用来记录当前种子值,当要生成新随机数时根据当前种子计算新种子并更新回原子变量。多线程下使用单个Random实例生成随机数时,多个线程同时计算随机数来计算新种子时,多个线程会竞争同一原子变量,由于原子变量更新是CAS操作,所以只有一个线程成功,其他线程自旋重试,降低并发性能。

ThreadLocalRandom

继承了Random类并重写了nextInt方法。ThreadLocalRandom并没有存放具体种子,而是存放在调用线程的threadLocalRandomSeed变量。当调用ThreadLocalRandom的current()方法时,ThreadLocalRandom初始化threadLocalRandomSeed变量。
当调用ThreadLocalRandom的nextInt()方法时,实际是获取threadLocalRandomSeed变量作为种子计算新种子并更新到threadLocalRandomSeed变量,再去计算随机数。
注意:threadLocalRandomSeed变量就是Thread类里的普通long变量,并非原子性变量(变量是线程级别的,无需原子性)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值