state在reentrantlock中精确表示当前线程的可重入次数,首次加锁cas设为1并记录持有线程,重入时state递增,释放时递减至0才真正解锁,且重入判断需同时满足线程匹配与state>0。

state 在 ReentrantLock 中直接承载“可重入次数”,不是简单的有锁/无锁标记,而是精确记录当前持有锁的线程重复加锁的次数。
state 是可重入逻辑的核心依据
ReentrantLock 允许同一线程多次调用 lock() 而不阻塞,靠的就是 state 的累加机制:
- 首次获取锁时,通过 CAS 将 state 从 0 改为 1,并把当前线程记为独占线程(
exclusiveOwnerThread) - 再次调用
lock(),发现当前线程就是持有者,就直接让 state +1(比如变成 2、3…) - 每次
unlock()都使 state -1;只有当 state 减到 0,才真正释放锁,并清空独占线程引用
state 和线程归属必须严格匹配
重入判断不是只看 state > 0,而是双重校验:
- 先检查
exclusiveOwnerThread == Thread.currentThread() - 再决定是走重入分支(state++),还是走竞争分支(入队等待)
- 如果 state > 0 但线程不匹配,说明是别的线程持锁,当前线程只能排队
公平性模式不影响 state 含义,只影响获取时机
无论公平锁还是非公平锁,state 始终表示“当前线程的持有次数”。区别在于尝试获取锁的策略:
- 非公平模式:先抢(CAS 修改 state),抢不到再查队列
- 公平模式:先调用
hasQueuedPredecessors(),队列非空就直接放弃抢锁,老老实实排队 - state 本身的语义和更新逻辑在这两种模式下完全一致
对比其他 AQS 同步器,state 含义不同
同一个 AQS 框架,不同同步器对 state 的解释完全不同:
- ReentrantLock:state = 当前线程的重入次数
- Semaphore:state = 剩余可用许可数(不绑定线程)
- CountDownLatch:state = 当前倒计数值
- ReentrantReadWriteLock:state 高 16 位是读锁计数,低 16 位是写锁重入次数
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











