判断当前节点是否在同步队列中,返回false表示不在,返回true表示在
如果不在AQS同步队列,说明当前节点没有唤醒去争抢同步锁,所以需要把当前线程阻塞起来,直到其他的线程调用signal唤醒
如果在AQS同步队列,意味着它需要去竞争同步锁去获得执行程序执行权限
为什么要做这个判断呢?原因是在condition队列中的节点会重新加入到AQS队列去竞争锁。也就是当调用signal的时候,会把当前节点从condition队列转移到AQS队列
大家思考一下,基于现在的逻辑结构。如何去判断ThreadA这个节点是否存在于AQS队列中呢?
1. 如果ThreadA的waitStatus的状态为CONDITION,说明它存在于condition队列中,不在AQS队列。因为AQS队列的状态一定不可能有CONDITION
2. 如果node.prev为空,说明也不存在于AQS队列,原因是prev=null在AQS队列中只有一种可能性,就是它是head节点,head节点意味着它是获得锁的节点。
3. 如果node.next不等于空,说明一定存在于AQS队列中,因为只有AQS队列才会存在next和prev的关系
4. findNodeFromTail,表示从tail节点往前扫描AQS队列,一旦发现AQS队列的节点和当前节点相等,说明节点一定存在于AQS队列中
final boolean isOnSyncQueue(Node node) {
if (node.waitStatus == Node.CONDITION || node.prev == null)
return false;
if (node.next != null) // If has
successor, it must be on queue
return true;
return findNodeFromTail(node);
}