回答
LongAdder
和 AtomicLong
都是用于确保在多线程环境下对 Long 类型变量进行原子性操作,而不会出现线程安全问题。虽然两者功能相似,但是还是存在一些差异。
一、实现方式
AtomicLong
是基于 CAS 方式自旋更新,使用单个变量来存储计数值,每次更新操作都是对这个单一变量进行CAS操作。LongAdder
是基于分段计数,将值分散到多个变量(称之为Cell
),每个线程会选择不同的Cell
来更新,减少了对单个变量的竞争。在最终需要获取总计数值时,将所有Cell
的值累加起来返回。
二、性能
AtomicLong
由于使用的 CAS 自旋方式,如果在高并发环境下,则容易导致CAS 操作失败,需要不断自旋重试,从而导致性能下降。所以,它适用于并发度较低的场景。LongAdder
由于分散了竞争,通过多个Cell
进行更新操作,减少了CAS冲突,性能更优。所以,它比较适用于并发度较高的场景,但是,由于LongAdder
需要维护多个Cell
,所以,在低并发场景下,其性能可能还不如AtomicLong
。
扩展
LongAdder 源码分析
LongAdder
的底层实现是通过内部维护一个基于分段思想的 Cell
数组来实现。在并发较低的情况下,它的性能与 AtomicLong
类似,但在高并发情况下,它通过减少热点变量的争用,大幅提高了性能。