LongAdder 相比 AtomicXXX 类性能更好的原因是什么?请解释其工作原理。

LongAdder 的性能之所以更好,主要原因在于它采用了一种分段累加的策略,有效地减少了线程间的竞争。其原理如下:

  1. 分段累加:LongAdder 在内部维护了一个 Cell 数组,每个 Cell 用于独立进行累加操作。当多个线程尝试同时更新时,它们会被分配到不同的 Cell 上,从而减少竞争。这种设计类似于分段锁的思想。

  2. 动态扩展:当线程数增加,竞争变得激烈时,LongAdder 可以动态地扩展 Cell 数组的大小,使得更多线程能够更新独立的 Cell,进一步减少竞争。

  3. 自旋重试:当线程发现自己要更新的 Cell 发生了竞争时(即 CAS 操作失败),它会自旋重试,直到成功。这种自旋重试的策略可以避免线程阻塞,提高响应速度。

  4. 累加求和:当需要获取累加结果时,LongAdder 会将所有 Cell 的值累加起来。这个操作通常发生在单线程环境中,不会影响并发性能。

因此,LongAdder 通过将热点数据分散到一个数组中,使得每个线程访问数组的不同部分,在高并发环境下可以有效地减少线程间的竞争,提高并发性能。相比之下,AtomicXXX 类(如 AtomicInteger 和 AtomicLong)在高并发环境中可能会出现大量的 CAS 操作失败并自旋重试,导致性能下降。

发表评论

后才能评论