摘要:總結總的來說,操作順序是進入隊列喚醒,成功獲得鎖將狀態變為并將其從轉到使再次獲得鎖執行余下代碼。當然這是理由狀態下,為了討論及的原理,實際的操作時序也有可能變化。
AQS Condition
最近面試被問到java concurrent包下有哪些熟悉的,用過的工具。因此來回顧一下,這些工具的底層實現,AbstractQueuedSynchronizer。在網上看到了其他人的一些技術博客,我將源碼貼出,分享下自己不同的見解。
對于初看源碼的我來說,很奇怪,為什么明明“waitThread1”已經拿到鎖的情況下,而“singalThread”還能獲取同樣的鎖而運行呢。這就得看源碼才能分析明白。
一開始waitThread拿到了鎖,然后調用了condition調用了await方法。
看看await方法:
首先方法中會構建一個node用來表示該node現在在Condition的queue中。Condition的queue維護著一連串的node,當前線程被包含在其中。
接下來fullyRelease方法會將AQS的當前狀態即state置為0(這里說的是具體的ReentrantLock的tryRelease實現方式,因為它是獨占鎖。)fullyRelease其中還會將AQS中維護的queue(其中同樣是node,只是Condition中的node記錄的是等待condition的node,AQS中的queue是等待鎖的node)中的線程釋放出來。注意,執行完這一步之后,若另一個線程singalThread由于lock而得不到鎖,已經在AQS的queue中,處于wait狀態,這時他將被喚醒,然后獲取到鎖,從AQS的queue中刪除。
當singalThread執行完singal的之中,就會將condition中的node移到AQS的queue上去。
具體代碼在condition中的signal方法中:
將其node的狀態改為SIGNAL,注意這個時候一般node還沒有被喚醒。
通常上面這一句不會為true,除非沒有能把目前node的狀態改為SIGNAL,或者node state大于0了,這個時候說明任務唄取消了,那么以上兩種情況都直接喚醒線程。除了上述兩種情況外,由signalthread的unlock操作喚醒在AQS上的線程。
總結總的來說,操作順序是:
waitthread lock
Signalthread lock 進入AQS隊列wait
waitthread await 喚醒 Signalthread,Signalthread成功獲得鎖
Signalthread signal 將waitthread 狀態變為signal并將其從condition queue轉到AQS queue
Signalthread unlock 使waitthread再次獲得鎖 執行余下代碼。
當然這是理由狀態下,為了討論AQS及condition的原理,實際的操作時序也有可能變化。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/70284.html
摘要:總結總的來說,操作順序是進入隊列喚醒,成功獲得鎖將狀態變為并將其從轉到使再次獲得鎖執行余下代碼。當然這是理由狀態下,為了討論及的原理,實際的操作時序也有可能變化。 AQS Condition 最近面試被問到java concurrent包下有哪些熟悉的,用過的工具。因此來回顧一下,這些工具的底層實現,AbstractQueuedSynchronizer。在網上看到了其他人的一些技術博客...
摘要:在中一般來說通過來創建所需要的線程池,如高并發原理初探后端掘金閱前熱身為了更加形象的說明同步異步阻塞非阻塞,我們以小明去買奶茶為例。 AbstractQueuedSynchronizer 超詳細原理解析 - 后端 - 掘金今天我們來研究學習一下AbstractQueuedSynchronizer類的相關原理,java.util.concurrent包中很多類都依賴于這個類所提供的隊列式...
摘要:在中一般來說通過來創建所需要的線程池,如高并發原理初探后端掘金閱前熱身為了更加形象的說明同步異步阻塞非阻塞,我們以小明去買奶茶為例。 AbstractQueuedSynchronizer 超詳細原理解析 - 后端 - 掘金今天我們來研究學習一下AbstractQueuedSynchronizer類的相關原理,java.util.concurrent包中很多類都依賴于這個類所提供的隊列式...
摘要:表示的是兩個,當其中任意一個計算完并發編程之是線程安全并且高效的,在并發編程中經常可見它的使用,在開始分析它的高并發實現機制前,先講講廢話,看看它是如何被引入的。電商秒殺和搶購,是兩個比較典型的互聯網高并發場景。 干貨:深度剖析分布式搜索引擎設計 分布式,高可用,和機器學習一樣,最近幾年被提及得最多的名詞,聽名字多牛逼,來,我們一步一步來擊破前兩個名詞,今天我們首先來說說分布式。 探究...
閱讀 2751·2021-11-22 13:54
閱讀 2687·2021-10-14 09:42
閱讀 3986·2021-09-28 09:47
閱讀 2161·2021-09-03 10:28
閱讀 1203·2021-07-26 23:38
閱讀 2557·2019-08-30 15:54
閱讀 2639·2019-08-29 16:35
閱讀 1425·2019-08-29 15:42