AQS的核心组件是volatile int state、FIFO双向同步队列和模板方法机制;state为同步状态核心,队列管理线程阻塞唤醒秩序,模板方法供子类定制获取/释放逻辑。

AQS的核心组件其实就三样:volatile int state、FIFO双向同步队列和模板方法机制。它不直接提供锁,而是把同步逻辑的骨架搭好,让子类去填关键行为。
state —— 同步状态的唯一真相
这个int变量是AQS的心脏,用volatile修饰,保证所有线程看到的状态都是一致的。它的含义完全由子类定义:
- 在ReentrantLock里,0表示无锁,1表示被占用,>1表示重入次数
- 在Semaphore中,它代表剩余许可数
- 在CountDownLatch中,它就是倒计时的当前值
所有修改都必须通过getState()、setState()、compareAndSetState()这三个原子方法,尤其是CAS操作,是线程安全的底层保障。
CLH双向队列 —— 等待线程的秩序系统
AQS内部维护一个虚拟的FIFO双向链表(CLH变种),头节点(head)和尾节点(tail)都是volatile的:
- 新线程抢锁失败时,会被封装成Node加入队尾
- head节点不存实际线程,只作哨兵;真正执行的线程从head.next开始
- 释放资源后,会唤醒head.next节点对应的线程,实现“接力式”调度
这个队列不是用来存储数据的,而是管理线程阻塞与唤醒的秩序——谁该等、谁该醒、谁该试,全靠它协调。
模板方法 —— 子类定制的入口
AQS本身是抽象类,不实现具体逻辑,只定义了一组protected方法,由子类决定怎么解释state和排队规则:
- tryAcquire(int):独占模式下尝试获取资源,返回true表示成功
- tryRelease(int):独占模式下尝试释放资源,返回true表示完全释放
- tryAcquireShared(int):共享模式下尝试获取,返回负数失败、0表示刚好够、正数表示还有富余
- tryReleaseShared(int):共享模式下释放,返回true表示状态已更新且可能唤醒其他线程
- isHeldExclusively():仅在用Condition时需要,判断当前是否独占持有
这些方法就像插槽,子类往里塞自己的业务语义,AQS就在外面统一调度排队、阻塞、唤醒。
理解这三者的关系:state是目标,队列是手段,模板方法是接口。它们合起来,让ReentrantLock、Semaphore、CountDownLatch这些看似不同的同步工具,背后共享同一套稳健的调度逻辑。










