ReentrantLock 的重入保护由 AQS 的 state 字段与 exclusiveOwnerThread 共同实现:state 记录重入次数,exclusiveOwnerThread 校验线程身份,确保仅持有线程可重入;公平性、中断与超时仅影响首次竞争,重入逻辑一致且高效。

ReentrantLock 的重入保护不是靠“状态位”单独实现的,而是通过 AQS(AbstractQueuedSynchronizer)的 state 字段 + 当前线程持有者(exclusiveOwnerThread)共同协作完成的。它本质上是“可重入的独占锁”,关键在于对 state 值的语义化使用和线程身份识别。
state 字段承载重入计数
AQS 中的 state 是一个 volatile int,ReentrantLock 将其用作重入次数计数器:
- 初始值为 0,表示锁未被任何线程持有;
- 当线程首次成功获取锁(通过 CAS 将 state 从 0 改为 1),同时记录 exclusiveOwnerThread = 当前线程;
- 同一线程再次调用 lock() 时,不再尝试 CAS 竞争,而是直接将 state +1(例如变为 2、3…);
- 每次 unlock() 会将 state -1,仅当 state 减至 0 时才真正释放锁,并清空 exclusiveOwnerThread。
exclusiveOwnerThread 保证线程归属判断
单纯靠 state 无法区分“谁在重入”,必须配合线程身份校验:
- tryAcquire() 方法中,先检查 state 是否为 0:是 → 尝试 CAS 获取;否 → 检查当前线程是否等于 exclusiveOwnerThread;
- 只有当前线程就是持有者时,才允许重入(state++),否则进入等待队列;
- 这一步杜绝了其他线程“蹭”重入计数的可能,是重入安全的核心前提。
公平性与非公平性的差异只影响首次竞争
公平锁和非公平锁在重入逻辑上完全一致,区别仅发生在 state == 0 时的获取策略:
立即学习“Java免费学习笔记(深入)”;
- 非公平锁:直接尝试 CAS 获取(可能插队);
- 公平锁:先检查同步队列是否有等待节点,有则放弃 CAS,直接入队;
- 一旦进入重入路径(即 state > 0 且线程匹配),两者行为完全相同,无需排队也无需 CAS。
可中断与超时获取不影响重入机制
lockInterruptibly() 或 tryLock(long, TimeUnit) 等变体,在重入场景下仍复用同一套 state + owner 判断逻辑:
- 若已是持有线程,立即成功,不涉及中断检查或计时;
- 只有在需要等待(即竞争失败后入队)时,才会启用 AQS 的中断响应或超时控制;
- 重入本身是无阻塞、无调度、纯内存操作,高效且原子。


















