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