AQS
和 CAS
是 Java 并发包(JUC)中两块非常关键的基础技术,它们经常一起出现,但作用不同、层级不同。
🧩 一句话理解
AQS 是构建锁和同步器的框架,CAS 是它实现无锁并发的底层原子操作手段。
📌 什么是 AQS(AbstractQueuedSynchronizer)
AQS
是一个抽象类,它为 Java 并发包中的各种同步器(锁、栅栏、信号量等)提供模板方法和队列管理机制。
- 管理“同步状态”
state
(一个int
) - 提供线程入队、出队、阻塞、唤醒等机制
- 支持独占锁和共享锁
🔧 常见基于 AQS 实现的类:
同步器 | 说明 |
---|---|
ReentrantLock | 可重入独占锁 |
ReentrantReadWriteLock | 读写锁 |
Semaphore | 信号量 |
CountDownLatch | 倒计时器 |
FutureTask | 任务完成控制 |
📌 什么是 CAS(Compare And Swap)
CAS 是一种原子性指令操作,它的语义是:
如果当前值 == 预期值,则更新为新值,否则不变。
🔧 Java 提供的 CAS API 在类:
java.util.concurrent.atomic.*
java.lang.invoke.VarHandle
sun.misc.Unsafe
例如:
AtomicInteger i = new AtomicInteger(0);
i.compareAndSet(0, 1); // 如果 i==0,则设置为1
🔧 AQS 中是怎么用 CAS 的?
在 AQS 中,所有对 state
的并发修改,都依赖 CAS 保证线程安全。
例如:
protected final boolean compareAndSetState(int expect, int update) {
return unsafe.compareAndSwapInt(this, stateOffset, expect, update);
}
AQS 内部结构依赖 CAS 的地方包括:
功能 | CAS 作用 |
---|---|
修改 state | 保证原子更新 |
队列尾部追加节点(tail ) | 保证并发安全地入队 |
节点状态更新(等待/取消等) | 避免锁竞争 |
✅ 关系总结:AQS 和 CAS
项目 | AQS | CAS |
---|---|---|
是什么 | 同步器框架 | 原子操作机制 |
位置 | 高层抽象框架(用于构建锁) | 底层原语(用于原子更新变量) |
用途 | 提供加锁/排队/唤醒逻辑 | 实现无锁并发、状态更新 |
依赖关系 | ✅ AQS 中所有原子性都基于 CAS 实现 | ❌ CAS 不依赖 AQS,可单独使用 |
是否线程安全 | ✅ 是(依靠 CAS 实现) | ✅ 是(天然原子性) |
📘 类比理解
比喻 | AQS | CAS |
---|---|---|
建筑物 | 大楼设计与结构(锁逻辑) | 钢筋混凝土(原子操作) |
编程角度 | 框架层/控制层 | 底层工具/机制层 |
使用方式 | 实现同步器子类或使用已有锁 | 直接用于无锁变量更新 |
🧠 总结口诀
AQS 管理锁逻辑,CAS 保证原子性;
锁队列靠 AQS,状态更新看 CAS;
高层框架 AQS 底层基础用 CAS;
两者联手,共建并发神器!