摘要:線程將再次嘗試獲取鎖定以確保它在實際停放之前無法獲取。如果沒有頭,則表示隊列中沒有線程,因此沒有人發(fā)出信號。如果后繼節(jié)點未處于取消狀態(tài),則取消后繼節(jié)點的線程,以便它可以重試獲取。
摘要排隊同步器類
它提供了一個框架,用于實現阻塞鎖和相關的同步器,如信號量, CountDownLatch等。獲取的基本算法是try acquire,如果成功則返回其他排隊線程(如果它尚未排隊)并阻止當前線程。同樣,發(fā)布的基本算法是try release,如果成功,則取消阻塞隊列中的第一個線程,否則只返回。線程將在先進先出(FIFO)等待隊列中等待。抽象方法 tryAcquire()和tryRelease()將根據需要由子類實現。
以獨家模式獲取
以獨占模式獲取的通用算法
AbstractQueuedSynchronizer(AQS)
在上面的圖中"shouldParkAfterFailedAcquire?" 驗證前任的等待狀態(tài)是否為SIGNAL。如果是,它確定前任線程將在其釋放時SIGNAL,因此它將立即阻止,否則它可能會重試獲取鎖,以防它是隊列中的第一個節(jié)點。
AbstractQueuedSynchronizer(AQS)
隊列
如果線程無法獲取鎖,它將被放入隊列中。如果隊列尚不存在,它將使用虛擬標頭初始化它,然后將其自身鏈接到它。頭部的“下一個”和節(jié)點的“上一個”將被鏈接。新節(jié)點也成了尾巴。標題節(jié)點的等待狀態(tài)將設置為SIGNAL,以便當所有者線程釋放鎖時,它可以通知頭節(jié)點的后繼者獲取鎖。線程將再次嘗試獲取鎖定以確保它在實際停放之前無法獲取。
AbstractQueuedSynchronizer(AQS)
因此,只要其前任節(jié)點的等待狀態(tài)被設置為SIGNAL,就可以安全地停放未能獲得鎖的線程,因此一旦前一個被釋放,它就可以重試獲取鎖。
如果前一個被取消,它將跳過所有被取消的前任,以重置其等待線程的next和prev指針。
AbstractQueuedSynchronizer(AQS)
發(fā)布
AbstractQueuedSynchronizer(AQS)
子類將根據他們的要求實現“try Release”。一旦發(fā)布,標頭節(jié)點的后繼節(jié)點需要發(fā)信號,以便它可以重新嘗試獲取。如果沒有頭,則表示隊列中沒有線程,因此沒有人發(fā)出信號。如果磁頭存在,則確保等待狀態(tài)不為零。如果它為零,則意味著不需要發(fā)信號通知后繼節(jié)點。
Unpark后繼節(jié)點的線程
線程到unpark是在后繼節(jié)點,通常只是下一個節(jié)點。
情況1:如果頭部的等待狀態(tài)<0,則清除等待狀態(tài)。如果后繼節(jié)點(P1)未處于取消狀態(tài),則取消后繼節(jié)點的線程,以便它可以重試獲取。
AbstractQueuedSynchronizer(AQS)
情況2:如果后繼節(jié)點取消或為null,則從尾部向后遍歷以查找實際未取消的后繼節(jié)點。
AbstractQueuedSynchronizer(AQS)
一旦取消停放線程,其節(jié)點就成了新頭。老頭將脫鉤。如果未能獲得,將重新停放。頭節(jié)點的等待狀態(tài)設置為0將重置為SIGNAL。
發(fā)布共享
這與獨家發(fā)布類似。它還確保釋放傳播。
以共享模式獲取
這類似于獨家收購。它還將釋放傳播到隊列中等待獲取共享鎖的其他等待線程。一旦鎖定被釋放,它就會取消其后繼節(jié)點的停放,后者又將釋放傳播到下一個節(jié)點。
取消
在嘗試獲取時可能存在運行時異常,在這種情況下將取消上下文中的節(jié)點。如果節(jié)點被取消,我們必須確保其后繼節(jié)點正確鏈接到有效的前任節(jié)點,因此可能必須調整鏈接。如果其前任節(jié)點已經處于取消狀態(tài),則將跳過這些節(jié)點以到達具有等待狀態(tài)<= 0的適當的前任節(jié)點。
如果要取消的節(jié)點本身是尾節(jié)點,則將簡單地將其移除。它的前身節(jié)點將成為新的尾巴。新尾部的“下一個”鏈接將指向null。
如果等待狀態(tài)<0,則表示后繼者需要信號,嘗試設置前任的下一個鏈接,以便獲得一個。如果前任是頭節(jié)點本身,則它將喚醒其后繼節(jié)點。
情況1:要取消的節(jié)點是尾節(jié)點
AbstractQueuedSynchronizer(AQS)
情況2:取消節(jié)點的前任是head,現在將發(fā)信號通知被取消節(jié)點的下一個節(jié)點被喚醒。
原文地址:https://www.javarticles.com/2...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/77905.html
摘要:線程將再次嘗試獲取鎖定以確保它在實際停放之前無法獲取。如果沒有頭,則表示隊列中沒有線程,因此沒有人發(fā)出信號。如果后繼節(jié)點未處于取消狀態(tài),則取消后繼節(jié)點的線程,以便它可以重試獲取。 摘要排隊同步器類它提供了一個框架,用于實現阻塞鎖和相關的同步器,如信號量, CountDownLatch等。獲取的基本算法是try acquire,如果成功則返回其他排隊線程(如果它尚未排隊)并阻止當前線...
摘要:總結總的來說,操作順序是進入隊列喚醒,成功獲得鎖將狀態(tài)變?yōu)椴⑵鋸霓D到使再次獲得鎖執(zhí)行余下代碼。當然這是理由狀態(tài)下,為了討論及的原理,實際的操作時序也有可能變化。 AQS Condition 最近面試被問到java concurrent包下有哪些熟悉的,用過的工具。因此來回顧一下,這些工具的底層實現,AbstractQueuedSynchronizer。在網上看到了其他人的一些技術博客...
摘要:總結總的來說,操作順序是進入隊列喚醒,成功獲得鎖將狀態(tài)變?yōu)椴⑵鋸霓D到使再次獲得鎖執(zhí)行余下代碼。當然這是理由狀態(tài)下,為了討論及的原理,實際的操作時序也有可能變化。 AQS Condition 最近面試被問到java concurrent包下有哪些熟悉的,用過的工具。因此來回顧一下,這些工具的底層實現,AbstractQueuedSynchronizer。在網上看到了其他人的一些技術博客...
摘要:如果此時,鎖被釋放,需要通知等待線程再次嘗試獲取鎖,公平鎖會讓最先進入隊列的線程獲得鎖。等待隊列節(jié)點的操作由于進入阻塞狀態(tài)的操作會降低執(zhí)行效率,所以,會盡力避免試圖獲取獨占性變量的線程進入阻塞狀態(tài)。 ?今天我們來研究學習一下AbstractQueuedSynchronizer類的相關原理,java.util.concurrent包中很多類都依賴于這個類所提供隊列式同步器,比如說常用的R...
閱讀 3484·2021-11-12 10:36
閱讀 2857·2021-09-22 15:35
閱讀 2806·2021-09-04 16:41
閱讀 1162·2019-08-30 15:55
閱讀 3573·2019-08-29 18:43
閱讀 2069·2019-08-23 18:24
閱讀 1411·2019-08-23 18:10
閱讀 1920·2019-08-23 11:31