ReentrantLock 通过内部抽象类 Sync 继承 AQS 实现同步,利用 state 表示重入次数、CLH 队列管理线程,并重写 tryAcquire/tryRelease/isHeldExclusively;FairSync 和 NonfairSync 分别实现公平与非公平策略,lock/unlock 委托 AQS 的 acquire/release 方法完成线程安全操作。

ReentrantLock 的核心同步机制是通过内部类 Sync 继承 AbstractQueuedSynchronizer(AQS)实现的。这不是简单地“继承一下就行”,而是利用 AQS 提供的状态管理、等待队列和线程调度能力,配合 ReentrantLock 的可重入、公平/非公平语义进行定制化实现。
Sync 类作为 AQS 的具体子类
ReentrantLock 定义了抽象内部类 Sync,它直接继承 AQS:
abstract static class Sync extends AbstractQueuedSynchronizer { ... }这个继承关系让 Sync 自动获得 AQS 的关键能力:
- 使用 state 字段表示锁的持有状态(0 表示未被占用,≥1 表示被持有,值即重入次数)
- 复用 AQS 内置的 CLH 同步队列管理阻塞线程
- 调用 acquire(int) / release(int) 等模板方法完成加锁/解锁流程
重写 AQS 的核心钩子方法
Sync 必须实现 AQS 规定的几个抽象方法,才能把通用框架适配成“可重入独占锁”:
-
tryAcquire(int acquires):尝试获取锁。需判断当前线程是否已持有锁(可重入),或锁是否空闲(CAS 设置 state)。公平版本还会检查队列中是否有前驱节点。 -
tryRelease(int releases):尝试释放锁。将state减去对应数量,为 0 时才真正释放,并唤醒后继节点。 -
isHeldExclusively():判断当前线程是否独占持有锁(用于 Condition 实现)。
FairSync 和 NonfairSync 分别继承 Sync
Sync 是抽象类,实际由两个具体子类实现不同策略:
立即学习“Java免费学习笔记(深入)”;
-
FairSync:在tryAcquire中先调用!hasQueuedPredecessors(),确保只有队列为空或当前线程排在队首时才尝试抢锁。 -
NonfairSync:直接尝试 CAS 抢锁(“插队”),失败后再走 AQS 的常规入队逻辑 —— 这就是非公平锁的体现。
lock() 和 unlock() 委托给 AQS 模板方法
用户调用 lock() 时,实际执行的是:
final void lock() {
sync.acquire(1); // 调用 AQS 的 acquire,最终触发 tryAcquire
}而 unlock() 调用:
public void unlock() {
sync.release(1); // 调用 AQS 的 release,最终触发 tryRelease
}这些操作都复用了 AQS 已验证的线程安全逻辑:状态变更、线程挂起/唤醒、队列维护等,ReentrantLock 只需专注语义定义。


















