JUC包中的分而治之策略-为提高性能而生( 九 )

多线程下使用单个Random实例生成随机数时候 , 多个线程同时计算随机数计算新的种子时候多个线程会竞争同一个原子变量的更新操作 , 由于原子变量的更新是CAS操作 , 同时只有一个线程会成功 , 那么CAS操作失败的大量线程进行自旋重试 , 而大量线程的自旋重试是会降低并发性能和消耗CPU资源的 , 为了解决这个问题 , ThreadLocalRandom类应运而生 。

如上代码(10)调用ThreadLocalRandom.current()来获取当前线程的随机数生成器 。 下面来分析下ThreadLocalRandom的实现原理 。

从名字看会让我们联想到ThreadLocal类 。 ThreadLocal通过让每一个线程拷贝一份变量 , 每个线程对变量进行操作时候实际是操作自己本地内存里面的拷贝 , 从而避免了对共享变量进行同步 。 实际上ThreadLocalRandom的实现也是这个原理 。 Random的缺点是多个线程会使用原子性种子变量 , 会导致对原子变量更新的竞争 , 这个原理可以通过下面图来表达:

推荐阅读