LongAdder和AtomicLong的区别

AtomicLong的原理是依靠底层的cas来保障原子性的更新数据,在要添加或者减少的时候,会使用自循(CLH)方式不断地cas到特定的值,从而达到更新数据的目的。然而在线程竞争激烈的情况下,自循往往浪费很多计算资源才能达成预期效果。

 

面对自循的缺点,jdk1.8推出了LongAdder类,他的实现方式有点像ConcurrentHashMap一样,采用空间换时间的方式,提高在线程竞争激烈的情况下,提供计数的效率,接下来我们看看源码是怎么实现的。线程数越多,并发操作数越大,LongAdder的优势逐渐体现出来

 

看源码前,我们先明白源码做了些什么,这样有目的的看,往往事半功倍。

 

LongAdder内里面存在一个Cell数组,计数是将线程id进行hash算法后,得到一个小于等于当前计算机核数的值,根据该值定位到一个cell数组,然后操作该cell进行单独计数。最终求总计数值时候,把所有的cell数组值相加即可。这样将多个线程操作一个AtomicLong转变为多个线程操作多个cell的情况,自然竞争小了,效率高了。可是存储空间大了。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值