2024-08-04
版权声明:本文为博主付费文章,严禁任何形式的转载和摘抄,维权必究。 本文链接:https://www.skjava.com/mianshi/baodian/detail/1186766688

回答

LongAdderAtomicLong 都是用于确保在多线程环境下对 Long 类型变量进行原子性操作,而不会出现线程安全问题。虽然两者功能相似,但是还是存在一些差异。

一、实现方式

  • AtomicLong 是基于 CAS 方式自旋更新,使用单个变量来存储计数值,每次更新操作都是对这个单一变量进行CAS操作。
  • LongAdder是基于分段计数,将值分散到多个变量(称之为 Cell),每个线程会选择不同的 Cell 来更新,减少了对单个变量的竞争。在最终需要获取总计数值时,将所有 Cell 的值累加起来返回。

二、性能

  • AtomicLong 由于使用的 CAS 自旋方式,如果在高并发环境下,则容易导致CAS 操作失败,需要不断自旋重试,从而导致性能下降。所以,它适用于并发度较低的场景。
  • LongAdder 由于分散了竞争,通过多个 Cell 进行更新操作,减少了CAS冲突,性能更优。所以,它比较适用于并发度较高的场景,但是,由于 LongAdder 需要维护多个 Cell,所以,在低并发场景下,其性能可能还不如 AtomicLong

扩展

LongAdder 源码分析

LongAdder 的底层实现是通过内部维护一个基于分段思想的 Cell 数组来实现。在并发较低的情况下,它的性能与 AtomicLong 类似,但在高并发情况下,它通过减少热点变量的争用,大幅提高了性能。