高并发下的计数——LongAdder


一、什么是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都加起来作为最终结果。

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_44153131/article/details/129827113
今日推荐