isHeldExclusively是AQS中由子类实现的模板方法,用于在Condition.await()等场景下严格校验当前线程是否独占持有同步状态,确保语义安全;它不参与锁获取释放,仅作只读判断,典型实现如ReentrantLock检查ownerThread是否为当前线程。

isHeldExclusively 是 AQS(AbstractQueuedSynchronizer)中一个模板方法,由子类实现,用于告诉 AQS “当前线程是否以独占模式持有同步状态”。它不参与锁的获取或释放逻辑,而是在某些特定场景下被 AQS 调用,用来做**安全校验或语义一致性判断**——最典型的就是 ConditionObject 的 await() 操作。
为什么需要 isHeldExclusively?
Condition 的设计前提是:调用 await() 前,线程必须已持有对应的独占锁(比如 ReentrantLock)。AQS 无法预知子类如何定义“持有锁”,所以把判定权交给子类。如果子类没正确实现这个方法,await() 可能抛出 IllegalMonitorStateException,或者出现语义错误(比如在非持锁状态下进入等待队列)。
它在哪被调用?
主要在 ConditionObject 的 await() 方法开头:
- AQS 先调用 isHeldExclusively() 检查当前线程是否真的持有独占锁;
- 若返回 false,直接抛出 IllegalMonitorStateException;
- 只有返回 true,才继续将当前线程加入条件队列、释放同步状态、挂起等后续操作。
子类怎么实现它?
实现逻辑非常直接:检查当前线程是否是同步状态的唯一持有者,并且状态值 > 0(对可重入锁还需考虑重入计数)。例如 ReentrantLock.Sync 的实现:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
protected final boolean isHeldExclusively() {
return getExclusiveOwnerThread() == Thread.currentThread();
}
注意:这里只判断 owner 线程是否为当前线程,隐含前提是 state > 0(因为只有成功 acquire 后 owner 才会被设为当前线程,且 state 已更新)。如果你的锁支持可重入,只要 owner 是当前线程,就认为“已持有”——无需再比对 state 值,因为 AQS 的 acquire/release 流程已保证 state 和 owner 的一致性。
常见误区提醒
- 不是用于控制加锁逻辑:acquire、tryAcquire 等方法决定能否获取锁,isHeldExclusively 不参与该过程;
- 不能返回“大概率持有”或“可能持有”:必须严格、快速、无副作用地返回布尔结果;
- 不要在其中修改 state 或 owner 字段:它只是只读校验,AQS 依赖其纯粹性做安全判断;
- 如果实现的是共享锁(如 CountDownLatch、Semaphore),通常不需要重写它,因为 Condition 不适用于共享模式。
本质上,isHeldExclusively 是 AQS 与子类之间关于“独占持有”语义的一次契约——子类定义什么叫“持有”,AQS 在关键节点(如 await)按此契约做守门人。不复杂但容易忽略,写错会导致 Condition 行为异常,调试起来隐蔽性强。

















