AtomicInteger 通过 CPU 级 CAS 指令实现无锁原子操作,避免 synchronized 或 lock;提供 incrementAndGet、compareAndSet 等线程安全方法,但仅保证单变量原子性,不解决多变量协同或 ABA 问题。

Java 中用 AtomicInteger 实现无锁原子操作,核心是依靠底层的 CAS(Compare-And-Swap)指令,避免使用 synchronized 或 lock,从而提升并发性能。
为什么 AtomicInteger 能做到“无锁”
它不依赖操作系统级的互斥锁,而是通过 CPU 提供的原子指令(如 x86 的 cmpxchg)直接在硬件层面保证读-改-写操作的原子性。每次修改前先比较当前值是否与预期一致,一致才更新,否则重试——这个过程对应用层透明,无需手动加锁。
常用原子操作方法及典型用法
以下方法全部是线程安全的,可直接在多线程环境中调用:
-
incrementAndGet():原子自增并返回新值,适合计数器场景,比如请求统计、ID 生成 -
getAndIncrement():返回旧值再自增,常用于实现无锁队列或序列号分配 -
compareAndSet(expected, updated):最基础的 CAS 操作,成功返回 true,失败可配合循环实现自定义原子逻辑 -
addAndGet(delta):原子加指定数值,比循环调用 increment 更高效 -
get()和set(value):提供 volatile 语义的读写,保证可见性(但 set 不是原子更新)
一个实用的无锁计数器示例
模拟高并发下安全累加:
AtomicInteger counter = new AtomicInteger(0); // 多个线程同时执行 counter.incrementAndGet(); // 安全 +1,无需 synchronized
对比普通 int:若用 int count++,即使只一行代码,在字节码层面也包含 get、add、put 三步,多线程下极易丢失更新;而 AtomicInteger 把这三步压缩为一次不可分割的硬件操作。
注意事项和常见误区
- 它只能保证单个变量的操作原子性,**不能保证多个 Atomic 变量之间的操作整体原子**(比如同时更新 count 和 timestamp,仍需额外同步)
- CAS 有 ABA 问题(值从 A→B→A),但对计数器类场景通常无影响;若业务敏感,可用
AtomicStampedReference - 过度依赖自旋重试(如在高竞争下频繁 CAS 失败)可能浪费 CPU,此时需评估是否改用锁或其他并发结构
- 构造时建议显式初始化:
new AtomicInteger(0),避免默认值引发理解偏差
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











