atomicinteger性能最差,longadder和longaccumulator性能相近且远超前者;前者依赖单点cas自旋易卡顿,后两者采用分段无锁协作机制,适用于高并发计数与定制化聚合场景。

在超高并发场景下,AtomicInteger、LongAdder 和 LongAccumulator 的性能差异非常显著——不是“谁稍快一点”,而是量级差距。核心原因不在语法或 API 设计,而在底层竞争处理机制:一个是单点 CAS 自旋(AtomicInteger),另两个是分段热点、无锁协作(LongAdder / LongAccumulator)。
AtomicInteger:简单可靠,但高争用时容易“卡住”
它靠 Unsafe + CAS 实现原子更新,逻辑干净,适合低并发或对精度要求极高的计数场景(如序列号生成)。但在 50 线程、每线程百万次 increment 的压测中,耗时通常是 LongAdder 的 3–5 倍。根本问题在于:所有线程反复争抢同一个内存地址,失败后立即重试,CPU 大量空转。尤其当核心数多、线程密集时,CAS 失败率飙升,吞吐迅速见顶。
- 适用场景:并发不高(
- 不建议用于:秒杀计数、实时 PV/UV 统计、日志埋点累加等热点写入场景
- 注意:incrementAndGet() 返回的是更新后的值,但高并发下多次调用可能因重试导致实际执行延迟不可控
LongAdder:为“高吞吐计数”而生的分段加速器
它内部维护一个 base 字段 + Cell[] 数组。初始无竞争时走 base;一旦检测到 CAS 冲突,就通过 ThreadLocalRandom 找一个 Cell 槽位做本地 CAS,把全局竞争“打散”。阿里《Java 开发手册》明确推荐 JDK8+ 用 LongAdder 替代 AtomicLong 做计数器。
- 压测典型结果(50 线程 × 100 万次):比 AtomicInteger 快 3–4 倍,比 synchronized 快 10 倍以上
- sum() 是最终聚合操作,非实时强一致——中间调用可能略低于真实值(因 Cell 未全部 flush)
- 内存开销略高(Cell 数组默认最多 128 个槽),但换来的是线性可扩展的写吞吐
LongAccumulator:LongAdder 的“可编程升级版”
它复用了 LongAdder 的 Cell 分段结构,但把固定加法替换为自定义二元函数(如 max、min、xor、甚至 (x,y)->x+y*2)。因此它不只是“更快的加法器”,而是支持更广语义的并发聚合工具。
- 性能与 LongAdder 基本持平(同构设计),压测中耗时差异通常在 ±5% 内
- 适合需要非线性聚合的场景:比如统计请求响应时间的最大值、累计哈希异或校验、动态权重叠加等
- 构造时传入的 function 必须是无副作用、满足结合律的纯函数,否则结果不可靠
选哪个,关键看需求重心:要绝对精确和低开销 → AtomicInteger;要扛住千万级 QPS 计数 → LongAdder;要计数逻辑可定制且仍需高吞吐 → LongAccumulator。











