ThreadLocalRandom的使用

吃可爱长大的小学妹 提交于 2020-03-20 13:28:24

3 月,跳不动了?>>>

ThreadLocalRandom继承了Random接口,并且实现了Serializable接口,就已经知道了它的真身!

因为Random的实现由于原子变量的更新是 CAS 操作,同时只有一个线程会成功,所以会造成大量线程进行自旋重试,这是会降低并发性能的,所以 ThreadLocalRandom 应运而生。

在并发程序中使用ThreadLocalRandom而不是共享Random对象通常会更少的开销和争用。当多个任务(例如,每个ForkJoinTask)在线程池中并行使用随机数时,使用ThreadLocalRandom是特别合适的。

ThreadLocalRandom在java.util.concurrent包下,是一个与当前线程隔离的随机数生成器。

类的用法通常应为以下形式:ThreadLocalRandom.current().nextX(...)(其中X为Int,Long等)。当所有用法都是这种形式时,永远不可能在多个线程中意外地共享ThreadLocalRandom。

该类还提供了其他常用的有界随机生成方法。

通过current方法ThreadLocalRandom实例,会先调用localInit方法初始化一些参数:

实现上的细节比较多,不是很明白,先来看看怎么用的吧

输出:

nextInt​():返回伪随机int值

这里的int mix32(long z)

数据的来源是 final long nextSeed() 是方法创造的

相应的还有其他基础数据类型的随机方法

其中看着名称比较特别的是nextGaussian​(),注释写着:返回下一个伪随机,高斯(“normally”)分布(正太)的双值,其平均值为0.0,标准偏差为1.0,该随机数生成器的序列。你看懂了吗?我没懂。

与Random类一样,我们也可以使用doubles(),ints()和longs()方法生成随机值流。

输出:

源码的实现如下面

当然还有类似的其他方法

先用Ramdon试试, end time:131

然后用用ThreadLocalRandom,end time:133

 

 

 

 

 

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!