AQS和CAS

AQSCAS 是 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

项目AQSCAS
是什么同步器框架原子操作机制
位置高层抽象框架(用于构建锁)底层原语(用于原子更新变量)
用途提供加锁/排队/唤醒逻辑实现无锁并发、状态更新
依赖关系✅ AQS 中所有原子性都基于 CAS 实现❌ CAS 不依赖 AQS,可单独使用
是否线程安全✅ 是(依靠 CAS 实现)✅ 是(天然原子性)

📘 类比理解

比喻AQSCAS
建筑物大楼设计与结构(锁逻辑)钢筋混凝土(原子操作)
编程角度框架层/控制层底层工具/机制层
使用方式实现同步器子类或使用已有锁直接用于无锁变量更新

🧠 总结口诀

AQS 管理锁逻辑,CAS 保证原子性;
锁队列靠 AQS,状态更新看 CAS;
高层框架 AQS 底层基础用 CAS;
两者联手,共建并发神器!

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注