LongAdder 的原理:
LongAdder 内部包含两个主要的成员变量:
base:用于存储单个线程对数值的修改。
cells:一个数组,用于存储多个线程对数值的修改。
当多个线程并发修改数值时,LongAdder 会根据哈希算法将线程分配到 cells 数组的各个槽位中,每个线程只对自己槽位中的值进行 CAS 操作。这样,线程之间的竞争就被分散到不同的槽位上,减少了冲突的概率,从而避免了大量的 CAS 空自旋,提高了并发效率。
LongAdder 的作用:
LongAdder 主要用于解决高并发场景下对单个数值的原子更新问题。它可以避免使用 AtomicInteger 等原子类时,由于所有线程都竞争同一个 value 值而导致的性能瓶颈。
LongAdder 如何提升 CAS 操作性能:
热点分离: LongAdder 将数值分散到 cells 数组的各个槽位中,每个槽位只被一个线程修改,减少了线程之间的竞争。
避免空自旋: 由于线程竞争被分散,CAS 操作失败的概率大大降低,避免了大量的空自旋,减少了 CPU 资源的浪费。
提升吞吐量: LongAdder 提高了并发操作的吞吐量,使得程序能够更快地处理更多任务。
LongAdder 的适用场景:
高并发场景: 当程序需要处理大量并发请求,并且对单个数值进行原子更新时,可以使用 LongAdder 来提升性能。
热点竞争场景: 当程序中存在热点竞争,导致性能瓶颈时,可以使用 LongAdder 来分散热点,降低竞争,提升性能。
本文作者:whitebear
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!