AQS是统一同步基础设施,ReentrantLock通过复用其机制实现锁功能。它定义state为重入计数,支持公平与非公平模式,提供中断、超时及条件队列能力,所有扩展均基于AQS封装的通用逻辑。

AQS(AbstractQueuedSynchronizer)本身不直接提供锁功能,而是作为统一的同步基础设施,让 ReentrantLock 能够以极简方式复用成熟机制,同时保留高度可定制性。它的扩展能力不是靠“添加新类”,而是通过设计契约——子类只需聚焦资源语义,其余排队、阻塞、唤醒等复杂逻辑均由 AQS 封装。
同步状态(state)的灵活语义定义
ReentrantLock 将 state 定义为重入计数:0 表示未锁定,1 表示首次获取,>1 表示同一线程多次重入。这种映射完全由 tryAcquire 和 tryRelease 实现决定。你也可以把 state 当作信号量值、读写锁的读写计数、甚至自定义资源配额,AQS 不关心具体含义,只保证原子更新和可见性。
独占与公平性的组合实现
ReentrantLock 通过两个内部子类体现扩展性:
-
FairSync:在
tryAcquire中额外检查队列是否有前置等待者,确保“先到先得”; - NonfairSync:允许插队(即刚释放锁就立刻被新线程抢到),提升吞吐但可能饿死长等待线程。
两者共享同一套 AQS 队列管理、线程阻塞(LockSupport.park)和唤醒逻辑,仅在“是否尝试抢占”这一判断点差异化,无需重复实现底层机制。
立即学习“Java免费学习笔记(深入)”;
中断与超时支持的标准化接入
ReentrantLock 的 lockInterruptibly() 和 tryLock(long, TimeUnit) 并非独立实现,而是复用 AQS 提供的模板方法:
-
acquireInterruptibly:在等待过程中响应Thread.interrupt(),抛出InterruptedException; -
tryAcquireNanos:结合parkNanos实现纳秒级超时,失败时自动清理节点并返回 false。
这些能力对所有基于 AQS 的同步器(如 CountDownLatch、Semaphore)通用,开发者无需为每种锁重新编写中断或超时逻辑。
条件队列(Condition)的解耦协作
ReentrantLock 通过 newCondition() 返回的 ConditionObject,复用 AQS 内置的条件等待队列。它与同步等待队列分离,但共享 state 管理:
- 调用
await()时,当前线程释放锁、进入条件队列,并触发signal()时才迁移回同步队列; - 整个过程依赖 AQS 对
Node.waitStatus == CONDITION的状态识别与节点转移,无需 Lock 自行维护两套队列结构。
这种分离设计让等待/通知语义清晰,也支持一个锁绑定多个独立条件变量,是 synchronized + wait/notify 无法直接做到的。
ReentrantLock 的强大,本质是 AQS 把并发控制中“谁该等、怎么等、何时醒、醒后做什么”这些共性问题收口统一,留给上层的只是几个语义明确的钩子方法。扩展不在代码量,而在抽象精准度和组合自由度。


















