659 字
3 分钟
Java 并发基础:CAS、AQS 与锁的实现关系

CAS:乐观地尝试更新#

CAS(Compare And Swap)是乐观锁思想的一种实现。它包含内存位置 V、预期值 A 与新值 B:只有当 V 的当前值仍等于 A 时,才将其更新为 B;否则说明其他线程已经修改过数据,需要重新读取并重试。

核心特点

CAS 不会先把线程阻塞起来,而是先尝试原子更新;失败后再决定重试或进入后续竞争流程。

AQS:构建同步器的通用框架#

AQS(AbstractQueuedSynchronizer)是 Java 并发包构建锁和同步器的基础框架,ReentrantLock 等组件都基于它实现。

它围绕两类状态工作:

  1. state:表示同步状态,例如锁是否被持有、重入次数等。
  2. FIFO 等待队列:线程获取资源失败后进入双向等待队列;资源释放时,框架从队列中选择合适线程继续竞争。

CAS 与 AQS 的关系#

AQS 提供同步状态、等待队列与阻塞唤醒等基础能力,具体同步器实现获取和释放规则。以 ReentrantLock 为例,竞争获取时可以使用 CAS 修改 state,失败后可能排队;重入时增加计数,释放时减少计数,完全释放后再允许其他线程获取。释放 state 并非所有实现都必须使用 CAS,不能描述成固定的一套 CAS 流程。

CAS 的常见问题#

  • ABA:值从 A 变成 B 又变回 A,普通 CAS 只能看到当前还是 A,无法识别中间变化;必要时使用版本号或 AtomicStampedReference。
  • 竞争成本:大量线程持续重试可能消耗 CPU,CAS 不保证总比锁快。
  • 范围有限:多个独立 CAS 不会自动组成事务,多个字段的一致性仍要合适的同步方案。

AQS 需要掌握到哪里?#

知道 state 表示同步状态、获取失败可能排队、释放后按规则唤醒,以及独占和共享模式即可。ReentrantLock、CountDownLatch、Semaphore 的状态含义不同,不能认为 state 都是重入次数。公平与否由获取策略决定,FIFO 等待队列本身不保证所有新请求按先来后到获得资源。

面试回答模板#

CAS 是比较并交换,当前位置等于预期值时才更新,用于原子类和同步器内部竞争。它要注意 ABA、重试开销和更新范围。AQS 是构建锁与同步器的框架,管理同步状态和等待队列,提供独占、共享等模式;具体同步器定义资源怎样获取和释放。

Java 并发基础:CAS、AQS 与锁的实现关系
https://blog.xqcherry.top/posts/interview/java/cas-and-aqs/
作者
xqcherry
发布于
2026-09-24
许可协议
CC BY-NC-SA 4.0