高并发下的计数——LongAdder

LongAdder是Java中用于高并发计数的一种线程安全的数据结构,它通过分段策略减少并发冲突,避免了AtomicLong在大量线程更新时的性能问题。当无竞争时,它行为类似于AtomicLong,直接更新基础值base。在有竞争的情况下,LongAdder使用Cell数组,每个线程通过哈希计算定位到特定Cell进行CAS操作,最后将所有Cell和base值累加得出结果。
摘要由CSDN通过智能技术生成


一、什么是LongAdder

高并发下计数,一般最先想到的应该是AtomicLong/AtomicInt,AtomicXX能保证并发情况下计数的准确性,其内部通过CAS来解决并发安全性的问题。当有大量线程同时去更新一个变量,任意一个时间点只有一个线程能够成功,绝大部分的线程在尝试更新失败后,会通过自旋的方式再次进行尝试,这样严重占用了CPU的时间片,进而导致系统性能问题。

LongAdder采用分段的方式,通过维护一个基准值base和 Cell 数组降低并发冲突的概率。可以用于对于热点评论的点赞数等应用场景。


二、工作原理

LongAdder的基本思路就是分散热点,将value值分散到一个Cell数组中,不同线程会命中到数组的不同槽中,各个线程只对自己槽中的那个值进行CAS操作,这样热点就被分散了,冲突的概率就小很多。如果要获取真正的long值,只要将各个槽中的变量值累加返回。sum()会将所有Cell数组中的value和base累加作为返回值。

LongAdder 并不会一开始就创建 Cell 数组,其本身也会维护一个 base 基础值,当 CAS 更新失败时才进行创建或者扩容。

LongAdder在无竞争的情况,跟AtomicLong一样,对同一个base进行操作,直接累加到变量base上。

当出现竞争关系时,从空间换时间,则是将一个value拆分进一个Cell数组。多个线程需要同时对value进行操作时,可以对线程id进行hash得到hash值,再根据hash值映射到这个数组cells的某个下标,再对该下标所对应的值进行自增操作。当所有线程操作完毕,将数组cells的所有值和无竞争值base都加起来作为最终结果。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值