编辑
2024-08-26
面试题库
0
请注意,本文编写于 149 天前,最后修改于 149 天前,其中某些信息可能已经过时。

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 许可协议。转载请注明出处!