ReentrantLock 的可重入性由 AQS 的 state 字段和 exclusiveOwnerThread 字段协同实现:state 记录重入次数,exclusiveOwnerThread 标识持有线程;同一线程重复加锁时 state 递增,解锁时递减,仅当 state 归零才真正释放锁并清空持有线程。

ReentrantLock 的可重入加锁,本质是通过 AQS(AbstractQueuedSynchronizer)的 state 字段 + 当前持有线程(exclusiveOwnerThread) 两个核心配合实现的,不是靠“多次 new 锁对象”或外部计数,而是由 AQS 子类(即 ReentrantLock 内部的 Sync)在 acquire 操作中主动判断和更新。
state 字段记录重入次数
AQS 的 state 是一个 volatile int,被 ReentrantLock 的同步器(Sync)直接复用: - 初始值为 0,表示锁空闲; - 线程首次成功获取锁时,state 设置为 1,并记录当前线程为 exclusiveOwnerThread; - 同一线程再次调用 lock(),发现 state ≠ 0 且当前线程就是持有者,就直接 state++(比如从 1→2、2→3…),不进入等待队列; - 每次 unlock() 都执行 state--,直到 state 回到 0 才真正释放锁,并清空 exclusiveOwnerThread。
tryAcquire 方法完成重入判断
ReentrantLock 的公平/非公平实现都重写了 AQS 的 tryAcquire(int acquires)(acquires 固定为 1)。该方法逻辑精简但关键:
- 先检查 state 是否为 0:是 → 尝试 CAS 设置 state=1,成功则设置 exclusiveOwnerThread = 当前线程;
- 若 state ≠ 0,再检查 exclusiveOwnerThread == 当前线程:成立 → 允许重入,state += acquires(即 +1);
- 否则说明被其他线程持有,返回 false,触发 AQS 的入队等待流程。
exclusiveOwnerThread 确保“同一线程”语义
AQS 本身不维护持有线程,ReentrantLock 的 Sync 显式继承 AQS 并在 tryAcquire 和 tryRelease 中读写 exclusiveOwnerThread 字段(AQS 提供了 setExclusiveOwnerThread / getExclusiveOwnerThread 方法)。这个字段让锁能准确识别“是不是我自己”,是可重入性的唯一依据——没有它,仅靠 state 无法区分是不同线程竞争还是同一线程重入。
释放时必须严格匹配重入次数
unlock() 调用 AQS 的 release(1),最终执行 Sync 的 tryRelease(int releases):
立即学习“Java免费学习笔记(深入)”;
- 先校验当前线程是否为持有者,不是则抛 IllegalMonitorStateException;
- 执行 state -= releases(releases=1);
- 只有当 state 减到 0 时,才返回 true,表示锁完全释放,并清空 exclusiveOwnerThread;
- 返回 true 后,AQS 才会唤醒后续等待节点。
这意味着:加锁 3 次,就必须 unlock 3 次,少一次锁不会真正释放,多一次会直接报错。


















