CAS与无锁编程
1. CAS 原理:Compare And Swap
CAS = 比较并交换,是一条CPU 原子指令(CMPXCHG),流程:
- 先比较:内存当前值 V == 预期旧值 A?
- 若相等:把内存值 V 改为新值 B
- 若不等:说明被别人改过,本次失败,可重试
伪代码逻辑(原子执行):
1 | |
2. CPU 原子指令与原子性
- CAS 由 硬件层面单条原子指令 保证原子性
- 不涉及锁、不阻塞线程,属于无锁并发
- 比 synchronized 更轻量,高并发读场景性能更好
3. CAS 三大问题
ABA 问题
一个值:A → B → A,CAS 看不出变化,误以为没动过。
循环自旋开销大
竞争激烈时,CAS 一直失败,CPU 空转。
只能保证单个变量原子性
不能同时保证多个共享变量的原子操作。
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与无锁编程/