使用 atomicinteger 或 atomiclong 等原子类配合 incrementandget()、addandget() 等原子方法可安全累加,底层依赖 cas 指令,无需 synchronized;高并发写密集场景优选 longadder;必须全程使用原子方法,禁用 get()+set() 组合;条件累加应使用 updateandget 或 compareandset;变量需 static final 保证正确发布与可见性。

直接用 AtomicInteger 或 AtomicLong 替代普通 int / long 变量,调用 incrementAndGet()、addAndGet() 等原子方法,就能安全累加——底层靠 CPU 的 CAS 指令保证单次操作不可分割,无需 synchronized 或 Lock。
选对原子类是前提
累加场景最常用的是:
-
AtomicInteger:适用于一般计数(如请求量、错误次数),值范围在
int内 -
AtomicLong:当累加值可能超 21 亿(
Integer.MAX_VALUE)时首选,避免溢出风险 -
LongAdder(JDK 8+):高并发写密集场景(如秒杀计数器),吞吐远高于 AtomicInteger,但不支持实时精确的
getAndIncrement()类操作
只用原子方法,别混用普通读写
声明原子变量后,必须全程使用其提供的原子方法,不能穿插 get() + 手动计算 + set():
- ✅ 正确:
counter.incrementAndGet()、counter.addAndGet(5) - ❌ 错误:
int v = counter.get(); counter.set(v + 1);—— 这两步之间可能被其他线程插入,导致丢失更新
复合逻辑要用 updateAndGet 或 compareAndSet
如果累加有条件(比如“只在小于 100 时才加”),不能拆成判断 + 增加两步:
- ❌ 危险写法:
if (counter.get() - ✅ 推荐写法(JDK 8+):
counter.updateAndGet(v -> v - ✅ 兼容老版本:
while (true) { int cur = counter.get(); if (cur >= 100) break; if (counter.compareAndSet(cur, cur + 1)) break; }
注意内存可见性与初始化
原子类本身已用 volatile 保障可见性,但需确保变量是 static final 或至少是正确发布的共享引用:
- ✅ 推荐声明:
private static final AtomicInteger counter = new AtomicInteger(0); - ⚠️ 避免非 final 实例变量未同步发布,否则其他线程可能看到未初始化的默认值
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











