Java并发-----第3章 Java并发包中ThreadLocalRandom类原理剖析

mac2025-09-19  34

第3章 Java并发包中ThreadLocalRandom类原理剖析


文章目录

第3章 Java并发包中ThreadLocalRandom类原理剖析@[toc]1. Random类及其局限性2. ThreadLocalRandom3. 源码分析(1). ThreadLocalRandom current()方法(2). int nextInt(int bound)方法

1. Random类及其局限性

​ Random生成随机数需要一个默认的种子,是一个long类型的数字.

生成新的随机数需要两个步骤:

现根据老的种子生成新的种子根据新的种子来计算新的随机数

​ 由于每个线程都共享一个种子.而由种子计算随机数的算法是通用的,那么在多线程下多个线程就可能会生成一样的随机数,这与我们的目的是不符的.所以这里会**使用CAS操作以保证对种子的操作的原子性**.

​ 但是CAS操作会造成**大量线程的自旋重试,降低并发性能**.

2. ThreadLocalRandom

​ 为了弥补多线程高并发情况下Random的缺陷,新增了ThreadLocalRandom类.

​ 在ThreadLocalRandom类中,每个线程都维护一个种子变量,每个线程的计算都是互不干扰的.

3. 源码分析

​ ThreadLocalRandom类集成了Random类.

​ ThreadLocalRandom中每个线程的种子存放在集体调用线程的threadLocalRandomSeed中,ThreadLocalRandom类只是个工具类.threadLocalRandomSeed变量就是Thread类中的一个普通long变量,不是原子变量(不需要这样设置,这个变量本身就是线程级别的).

​ 线程获取ThreadLocalRandom实例时,获取的是同一个实例,具体的种子存放在线程中,实例中只包含与线程无关的通用算法,所以是线程安全的.

(1). ThreadLocalRandom current()方法

​ 获取ThreadLocalRandom实例,并初始化调用线程中的threadLocalRandomSeed和threadLocalRandomProbe变量.(在不使用随机数功能时,不会初始化Thread类中的种子变量)

(2). int nextInt(int bound)方法

​ 计算当前线程的下一个随机数

最新回复(0)