ThreadLocalRandom的使用

38444c488567c1273e21470512053b2ff7a.jpg

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

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

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

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

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

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

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

820667d7e0cd0495aa74c971140302872d2.jpg

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

8ad012df2779b4244c9711cb4a145d3fbfc.jpg

输出:

5bbfaac946886f03813ad61b72b8247394a.jpg

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

0c4695d3700a2f828cb9bfc863a23e4850d.jpg

这里的int mix32(long z)

41e5645d3251d933ba77b4880801984f8bc.jpg

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

378d5019f0a7ecb45426816630946aa1083.jpg

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

c1c5542ee6327c923dbb317ade04d8eadeb.jpg

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

f4d049653438d551237c2a432bdd1926a51.jpg

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

362096cea81b636f38b5dd1b31e03fdf595.jpg

输出:

cc55052c0761f4de078d99e615669253be7.jpg

源码的实现如下面

55f42831ba32d385f4ff66fe42178dd802d.jpg

当然还有类似的其他方法

ba1b18e3f86b0a10f2f9b997a8ba2a3874b.jpg

先用Ramdon试试, end time:131

15c979f999a1cbf1d27958a012976caf3a4.jpg

然后用用ThreadLocalRandom,end time:133

3ffd4ae30bb981e85d0793e4f678cf2babb.jpg

 

 

 

 

 

 

转载于:https://my.oschina.net/u/2277632/blog/2999427

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值