isOnSyncQueue
生活随笔
收集整理的這篇文章主要介紹了
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); }?
總結
以上是生活随笔為你收集整理的isOnSyncQueue的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: fullyRelease
- 下一篇: Condition.signal