isOnSyncQueue

判断当前节点是否在同步队列中,返回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); 
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值