Java中可用AtomicInteger、AtomicLong等原子类实现无锁线程安全计数器,基于CAS避免synchronized阻塞;AtomicInteger适用于int范围计数,AtomicLong处理大数值或高并发场景,LongAdder在高竞争下性能更优,自定义操作需基于CAS循环确保原子性。

Java 中用 java.util.concurrent.atomic 包里的原子类(如 AtomicInteger、AtomicLong)可以轻松实现线程安全的无锁计数器和累加器,避免 synchronized 带来的阻塞开销。
用 AtomicInteger 实现基础无锁计数器
AtomicInteger 提供了基于 CAS(Compare-And-Swap)的原子更新操作,所有方法都是线程安全的,无需额外加锁。
-
初始化与递增:用
new AtomicInteger(0)创建初始值;调用incrementAndGet()原子性地加 1 并返回新值,getAndIncrement()返回旧值再加 1。 -
条件更新:用
compareAndSet(expected, updated)实现“检查后更新”,比如只在当前值为 5 时才设为 10。 - 注意 volatile 语义:内部 value 字段是 volatile 的,保证可见性;但它的 get/set 不提供 happens-before 关系,而原子方法(如 incrementAndGet)天然具备内存屏障语义。
用 AtomicLong 处理大数值或高并发累加
当计数器可能超过 int 范围,或对性能要求极高(如高频统计),优先选 AtomicLong。它和 AtomicInteger 接口一致,但底层操作 long 类型。
-
避免溢出风险:
addAndGet(long delta)会直接溢出(如 Long.MAX_VALUE + 1 → Long.MIN_VALUE),若需安全累加,可自行封装带溢出检查的逻辑,或改用LongAdder(见下文)。 -
批量累加更高效:在高竞争场景下,
LongAdder比AtomicLong性能更好——它通过分段累加+最终合并的方式减少 CAS 冲突。
用 LongAdder / DoubleAdder 替代高并发累加器
LongAdder 是 JDK 8 引入的高性能累加器,适用于“读多写少”且写操作高度并发的场景(如监控指标统计)。
立即学习“Java免费学习笔记(深入)”;
-
原理不同:不依赖单一变量 CAS,而是维护一个 cell 数组,线程先尝试更新 base 值,失败则哈希到某个 cell 上做局部累加,最后调用
sum()合并所有值。 -
适用场景明确:适合做总量累加(如请求总数、耗时总和),但不适合需要严格实时一致性的场景(
sum()不是强一致读)。 -
简单用法:创建
LongAdder adder = new LongAdder();,调用adder.increment()或adder.add(10),取值用adder.sum()。
自定义原子累加器(如支持 reset 或 min/max)
标准原子类不直接提供 reset 或取最小/最大值等操作,但可通过 CAS 循环安全实现:
-
原子重置:用
set(0)即可(本身就是原子写);若需“先取再清零”,可用getAndSet(0)。 -
原子取最小值:
int current; do { current = counter.get(); } while (current > newValue && !counter.compareAndSet(current, newValue)); - 组合操作注意点:避免在原子类上调用非原子的 get + set 组合,这会破坏线程安全性;所有复合逻辑应基于 compareAndSet 或 updateAndGet 等原子方法构建。


















