AQS 是 JUC 并发包的统一同步器骨架,通过 volatile state 和 FIFO 队列管理资源争用与线程调度,子类仅需实现 tryAcquire 等钩子方法即可定制独占/共享语义、公平性、中断响应及 Condition 等功能。

AQS 是 JUC 包真正的“发动机”,不是工具本身,而是所有主流同步工具的统一底盘。它不直接对外提供 API,但 ReentrantLock、Semaphore、CountDownLatch、CyclicBarrier、ReentrantReadWriteLock、FutureTask 等几乎全部重量级并发组件,底层都依赖 AQS 实现资源争用、线程排队与状态流转。
它是标准化的同步器骨架
AQS 把多线程协作中反复出现的逻辑抽成模板:如何判断能否获取资源、获取失败后怎么入队、被唤醒后怎么重试、释放资源后怎么通知下一个线程……这些通用流程它全写好了;子类只需聚焦业务语义,实现几个关键钩子方法即可:
- tryAcquire/tryRelease:定义独占模式下“加锁”和“解锁”的具体规则(比如可重入怎么算、state 增减逻辑)
- tryAcquireShared/tryReleaseShared:定义共享模式下“获取许可”和“归还许可”的计算方式(如 Semaphore 的 permits 减增)
- isHeldExclusively:仅在配合 Condition 使用时需实现,用于判断当前是否独占持有
它统一管理两个核心要素
所有基于 AQS 构建的同步器,背后都靠同一套机制驱动:
- volatile int state:一个原子整型变量,含义由子类解释——在 ReentrantLock 中是重入次数,在 Semaphore 中是剩余许可数,在 CountDownLatch 中是倒计数值
- FIFO 同步队列(CLH 变种双向链表):自动维护阻塞线程的等待顺序。线程获取失败就封装为 Node 入队并挂起;释放操作则唤醒头节点后继,交由其重试获取
它支撑多种同步语义的自由组合
AQS 不限定使用方式,而是提供基础能力,让上层能灵活表达不同并发模型:
立即学习“Java免费学习笔记(深入)”;
- 独占 vs 共享:ReentrantLock 是典型独占,Semaphore 和 CountDownLatch 属于共享语义
- 公平 vs 非公平:通过 acquire 方法是否检查队列首节点,就能切换调度策略
- 可中断 vs 不可中断:AQS 提供 acquireInterruptibly 等变体,把中断响应逻辑也纳入框架
- 带条件等待(Condition):通过额外的单向条件队列,支持 await/signal 等精确唤醒
它让自定义同步器变得可行且轻量
开发者无需从头处理线程挂起、唤醒、队列并发安全、内存可见性等底层细节。只要继承 AQS,实现两三个方法,就能得到一个符合 JMM 规范、线程安全、支持取消与中断的生产级同步器。这种“约定优于配置”的设计,正是 Doug Lea 对工程抽象的极致体现。


















