CAS与无锁编程

1. CAS 原理:Compare And Swap

CAS = 比较并交换,是一条CPU 原子指令(CMPXCHG),流程:

  1. 先比较:内存当前值 V == 预期旧值 A?
  2. 若相等:把内存值 V 改为新值 B
  3. 若不等:说明被别人改过,本次失败,可重试

伪代码逻辑(原子执行):

1
2
3
4
5
6
7
boolean cas(V, A, B) {
if (V == A) {
V = B;
return true;
}
return false;
}

2. CPU 原子指令与原子性

  • CAS 由 硬件层面单条原子指令 保证原子性
  • 不涉及锁、不阻塞线程,属于无锁并发
  • 比 synchronized 更轻量,高并发读场景性能更好

3. CAS 三大问题

  1. ABA 问题

    一个值:A → B → A,CAS 看不出变化,误以为没动过。

  2. 循环自旋开销大

    竞争激烈时,CAS 一直失败,CPU 空转。

  3. 只能保证单个变量原子性

    不能同时保证多个共享变量的原子操作。

4. Atomic 原子类

JUC 下 atomic 包基于 CAS 实现:

  • AtomicInteger:int 原子操作
  • AtomicLong:long 原子操作
  • AtomicBoolean:boolean 原子操作
  • AtomicReference:引用类型原子操作
  • AtomicIntegerArray 数组类型

常用方法:get()set()getAndIncrement()compareAndSet(expect, update)

5. ABA 解决方案:版本号机制

使用 AtomicStampedReference

  • 不仅比较,还比较版本号(时间戳)
  • 每次修改版本号 +1
  • A→B→A 版本号不同,CAS 会判定失败,避免 ABA 问题

对应类:

  • AtomicStampedReference:带版本号的引用原子类
  • AtomicMarkableReference:带标记位(简化版,只标记是否修改过)

CAS与无锁编程
http://hanqichuan.com/2026/04/15/java并发/CAS与无锁编程/
作者
韩启川
发布于
2026年4月15日
许可协议