isonsyncqueue通过检查waitstatus、prev和next指针判断节点是否已进入aqs同步队列:若waitstatus为condition则返回false;prev为null则返回false;next非null则返回true;否则最多遍历1000个节点确认。

isOnSyncQueue 方法通过检查节点的状态和指针关系,判断该节点是否已脱离 Condition 队列、进入 AQS 的同步等待队列(即 CLH 队列)。
核心判断逻辑:基于 waitStatus 和指针状态
一个节点在 Condition 队列中时,其 waitStatus 为 Node.CONDITION(值为 -2),且 nextWaiter 指向下一个 Condition 节点;而一旦被 signal 唤醒并成功转移到同步队列,它会被插入到 AQS 队列尾部,此时:
-
waitStatus不再是CONDITION(通常变为0或SIGNAL) -
prev和next指针不再为null(已接入 CLH 链表) -
nextWaiter可能被置为null或特殊标记(如Node.EXCLUSIVE)
具体判断步骤(源码精简逻辑)
isOnSyncQueue(Node node) 内部按顺序检查以下条件,任一成立即返回 true:
- 若
node.waitStatus == Node.CONDITION→ 一定还在 Condition 队列,直接返回false - 若
node.prev == null→ 尚未加入同步队列(CLH 队列要求 prev 不为 null),返回false - 若
node.next != null→ next 非空说明已在同步队列中(已被前驱节点链接),返回true - 否则执行一次从 tail 往前的线性遍历(最多查 1000 个节点):若能在 AQS 同步队列中找到该 node,返回
true;否则返回false
为什么需要遍历?—— 因为存在中间态
signal 操作中,节点从 Condition 队列移出后,需先设置 waitStatus = 0、清空 nextWaiter,再用 CAS 插入同步队列。这两个动作非原子,可能出现:
- 节点已脱离 Condition 队列(
waitStatus ≠ CONDITION,nextWaiter = null) - 但尚未完成 CAS 入队(
prev == null或next == null) - 此时仅靠指针判断不准,必须回扫同步队列确认是否已就位
实际使用注意点
该方法是内部工具方法,不建议业务代码直接调用。它的设计目标是辅助 await() 中的“自旋检测”逻辑,在唤醒后快速确认是否真正在同步队列中排队,从而决定是否尝试获取锁。
典型场景:await() 返回前会反复调用 isOnSyncQueue,直到返回 true 才退出自旋,进入 acquireQueued 流程。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











