aqs通过state计数器和exclusiveownerthread线程标识协同实现reentrantlock重入语义:state初始为0,首次获取锁时cas设为1并记录线程;同线程重入时state递增,unlock时递减,仅归零时清空owner并唤醒等待者;exclusiveownerthread用于校验重入身份;公平与非公平模式共享该机制,差异仅在首次抢锁策略;需手动配对lock/unlock并置于finally中保障异常安全。

AQS 通过 state 字段 + exclusiveOwnerThread 线程标识 协同实现 ReentrantLock 的重入语义,不是简单“有锁/无锁”二值判断,而是精确追踪“谁持有了多少次”。
state 字段承担计数功能
AQS 内部的 volatile int state 不是布尔开关,而是可递增递减的计数器:
- 初始值为 0,表示锁空闲
- 线程首次获取锁时,CAS 将 state 从 0 → 1,并记录当前线程到
exclusiveOwnerThread - 同一线程再次调用
lock(),发现exclusiveOwnerThread == current,就直接执行setState(state + 1) - 每次
unlock()都执行setState(state - 1),仅当 state 减至 0 时才真正清空exclusiveOwnerThread并唤醒等待者
exclusiveOwnerThread 保证归属判定
重入的前提是“同一线程”,AQS 借助 exclusiveOwnerThread 字段做身份校验:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
-
tryAcquire()在尝试加锁前,先比对getExclusiveOwnerThread() == Thread.currentThread() - 只有匹配成功,才进入重入逻辑(state 加 1);否则走竞争流程(排队或 CAS 抢锁)
- 这个字段由 AQS 提供,ReentrantLock 子类在获取锁成功后主动调用
setExclusiveOwnerThread(current)维护
公平与非公平模式共享同一套重入机制
重入逻辑本身与公平性无关,区别只在“首次抢锁失败后是否排队”:
- 非公平模式:先 CAS 尝试(不管队列),失败后再检查是否为重入;若不是重入,直接入队
- 公平模式:先调用
hasQueuedPredecessors(),若队列非空就跳过 CAS,直接入队;入队后唤醒时仍会检查重入条件 - 无论哪种模式,只要线程已在持有状态,后续 lock() 都走 state+1 路径,不涉及队列操作
异常安全依赖手动 unlock 配合 finally
重入计数的正确性需要开发者保障释放行为完整:
- 每次
lock()必须对应一次unlock(),否则 state 永远不归零,锁无法释放 - 必须把
unlock()放在finally块中,防止业务异常导致计数卡住 - 若某次重入后未 unlock,该线程后续仍能继续重入(state 继续累加),但其他线程永远拿不到锁
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










