AQS 是 ReentrantLock 的核心骨架,负责线程排队、状态管理与唤醒;state 表示重入次数,exclusiveOwnerThread 记录持锁线程,FIFO 队列协调阻塞,tryAcquire/tryRelease 为子类定制关键逻辑。

Java 中 AQS 的核心逻辑在 ReentrantLock 里不是“被调用”的配角,而是整个锁行为的骨架和引擎。ReentrantLock 本身不直接管理线程排队、状态变更或唤醒机制,它把所有这些重活、脏活都委托给 AQS —— 只需定义“什么算拿到锁”“什么算释放锁”,其余由 AQS 统一调度。
state 字段承载可重入语义
AQS 用一个 volatile int state 表示同步状态。对 ReentrantLock 来说,这个值就是当前线程持有锁的次数:
- state == 0:锁空闲,任何线程都可尝试抢占
- state > 0:锁已被占用,且值等于重入深度(比如同一线程 lock() 三次,state 就是 3)
- 每次成功获取锁,state 增加;每次 unlock(),state 减少;减到 0 才真正释放锁并唤醒后继
独占模式 + exclusiveOwnerThread 确保线程归属
ReentrantLock 是独占锁,AQS 为此提供 exclusiveOwnerThread 字段(来自父类 AbstractOwnableSynchronizer),记录当前持锁线程:
- 只有该线程才能重复加锁(实现可重入)
- 只有该线程才能解锁(防止误释放)
- tryAcquire() 会先检查 state 是否为 0;若不为 0,则进一步比对 getExclusiveOwnerThread() 是否等于当前线程
FIFO 同步队列管理阻塞线程
当线程抢锁失败,AQS 不让它自旋空等,而是封装成 Node 加入双向链表队列(head → tail):
立即学习“Java免费学习笔记(深入)”;
- 新节点总插入队尾(tail),保证公平性基础
- 头节点(head)代表正在运行或刚释放锁的线程
- 头节点释放锁后,AQS 自动唤醒其 next 节点对应的线程,后者尝试 acquire
- 非公平锁会允许新线程“插队”——先 CAS 抢 state,失败才入队;公平锁则跳过这步,直接入队
模板方法驱动流程,子类只定制关键判断
ReentrantLock 的 Sync 子类(FairSync / NonfairSync)不重写整个加锁逻辑,只实现 AQS 规定的几个钩子方法:
- tryAcquire(int):决定“此刻能否拿到锁”,返回 true 表示成功
- tryRelease(int):决定“这次 unlock 是否彻底释放”,返回 true 表示锁已完全空闲
- AQS 的 acquire() 和 release() 是模板方法:前者先调 tryAcquire,失败则入队阻塞;后者先调 tryRelease,成功则唤醒后继


















