atomicinteger 通过 cas 指令与 volatile 变量实现无锁原子操作:cas 提供原子性,volatile 保证可见性与有序性;高并发下自旋可能带来性能开销,适合低至中等并发场景。

AtomicInteger 通过底层 CPU 指令(如 CAS)+ volatile 变量语义实现无锁原子操作,不依赖 synchronized 或锁机制。
核心依赖:CAS(Compare-And-Swap)指令
AtomicInteger 的大多数原子方法(如 incrementAndGet()、compareAndSet())本质是循环执行 CAS 操作:
- CAS 是一条由 CPU 直接支持的原子指令:检查内存中某个位置的值是否等于预期值,如果是,则将其更新为新值;否则失败并返回 false。
- Java 中通过
Unsafe.compareAndSwapInt()调用该指令,JVM 会将其编译为对应平台的汇编指令(如 x86 的cmpxchg)。 - 如果 CAS 失败(比如其他线程已修改了值),方法通常会重试(自旋),直到成功为止——这就是“乐观锁”的思想。
volatile 保证可见性与禁止重排序
AtomicInteger 内部用一个 volatile int value 存储实际数值:
-
volatile确保每次读取都从主内存获取最新值,每次写入都立即刷回主内存,解决多线程下的可见性问题。 - 它还禁止 JVM 对 volatile 读写进行重排序,配合 CAS 使用,保证操作的有序性基础。
- 注意:
volatile单独不能保证复合操作(如 i++)的原子性,但和 CAS 结合后,就能支撑整个原子类的行为。
无锁 ≠ 无竞争,自旋可能带来开销
虽然不使用传统锁,但高并发下多个线程反复 CAS 失败会导致 CPU 自旋:
- 在竞争激烈场景(如大量线程同时 increment),可能引发显著的 CPU 浪费,甚至比轻量级锁更耗资源。
- JDK 8 引入了
LongAdder等类型,采用分段累加 + Cell 数组方式降低单点竞争,适合高并发计数场景。 - AtomicInteger 更适合低到中等并发、操作简单(如状态标志、序列号生成)的场合。
简单例子:线程安全的计数器
对比普通 int 和 AtomicInteger:
普通 int 不安全:int count = 0; // 多线程调用 count++ → 非原子(读-改-写三步),结果不可预期AtomicInteger 安全:
AtomicInteger count = new AtomicInteger(0); count.incrementAndGet(); // 底层循环 CAS,保证原子性
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











