成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

讀源碼筆記 Java AbstractQueuedSynchronizer

selfimpr / 1945人閱讀

摘要:總結(jié)總的來說,操作順序是進(jìn)入隊(duì)列喚醒,成功獲得鎖將狀態(tài)變?yōu)椴⑵鋸霓D(zhuǎn)到使再次獲得鎖執(zhí)行余下代碼。當(dāng)然這是理由狀態(tài)下,為了討論及的原理,實(shí)際的操作時(shí)序也有可能變化。

AQS Condition

最近面試被問到j(luò)ava concurrent包下有哪些熟悉的,用過的工具。因此來回顧一下,這些工具的底層實(shí)現(xiàn),AbstractQueuedSynchronizer。在網(wǎng)上看到了其他人的一些技術(shù)博客,我將源碼貼出,分享下自己不同的見解。

分析源碼

對于初看源碼的我來說,很奇怪,為什么明明“waitThread1”已經(jīng)拿到鎖的情況下,而“singalThread”還能獲取同樣的鎖而運(yùn)行呢。這就得看源碼才能分析明白。
一開始waitThread拿到了鎖,然后調(diào)用了condition調(diào)用了await方法。
看看await方法:

首先方法中會(huì)構(gòu)建一個(gè)node用來表示該node現(xiàn)在在Condition的queue中。Condition的queue維護(hù)著一連串的node,當(dāng)前線程被包含在其中。

接下來fullyRelease方法會(huì)將AQS的當(dāng)前狀態(tài)即state置為0(這里說的是具體的ReentrantLock的tryRelease實(shí)現(xiàn)方式,因?yàn)樗仟?dú)占鎖。)fullyRelease其中還會(huì)將AQS中維護(hù)的queue(其中同樣是node,只是Condition中的node記錄的是等待condition的node,AQS中的queue是等待鎖的node)中的線程釋放出來。注意,執(zhí)行完這一步之后,若另一個(gè)線程singalThread由于lock而得不到鎖,已經(jīng)在AQS的queue中,處于wait狀態(tài),這時(shí)他將被喚醒,然后獲取到鎖,從AQS的queue中刪除。

當(dāng)singalThread執(zhí)行完singal的之中,就會(huì)將condition中的node移到AQS的queue上去。
具體代碼在condition中的signal方法中:

將其node的狀態(tài)改為SIGNAL,注意這個(gè)時(shí)候一般node還沒有被喚醒。

通常上面這一句不會(huì)為true,除非沒有能把目前node的狀態(tài)改為SIGNAL,或者node state大于0了,這個(gè)時(shí)候說明任務(wù)唄取消了,那么以上兩種情況都直接喚醒線程。除了上述兩種情況外,由signalthread的unlock操作喚醒在AQS上的線程。

總結(jié)

總的來說,操作順序是:

waitthread lock

Signalthread lock 進(jìn)入AQS隊(duì)列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的原理,實(shí)際的操作時(shí)序也有可能變化。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/70284.html

相關(guān)文章

  • 源碼筆記 Java AbstractQueuedSynchronizer

    摘要:總結(jié)總的來說,操作順序是進(jìn)入隊(duì)列喚醒,成功獲得鎖將狀態(tài)變?yōu)椴⑵鋸霓D(zhuǎn)到使再次獲得鎖執(zhí)行余下代碼。當(dāng)然這是理由狀態(tài)下,為了討論及的原理,實(shí)際的操作時(shí)序也有可能變化。 AQS Condition 最近面試被問到j(luò)ava concurrent包下有哪些熟悉的,用過的工具。因此來回顧一下,這些工具的底層實(shí)現(xiàn),AbstractQueuedSynchronizer。在網(wǎng)上看到了其他人的一些技術(shù)博客...

    YuboonaZhang 評論0 收藏0
  • 高并發(fā) - 收藏集 - 掘金

    摘要:在中一般來說通過來創(chuàng)建所需要的線程池,如高并發(fā)原理初探后端掘金閱前熱身為了更加形象的說明同步異步阻塞非阻塞,我們以小明去買奶茶為例。 AbstractQueuedSynchronizer 超詳細(xì)原理解析 - 后端 - 掘金今天我們來研究學(xué)習(xí)一下AbstractQueuedSynchronizer類的相關(guān)原理,java.util.concurrent包中很多類都依賴于這個(gè)類所提供的隊(duì)列式...

    levius 評論0 收藏0
  • 高并發(fā) - 收藏集 - 掘金

    摘要:在中一般來說通過來創(chuàng)建所需要的線程池,如高并發(fā)原理初探后端掘金閱前熱身為了更加形象的說明同步異步阻塞非阻塞,我們以小明去買奶茶為例。 AbstractQueuedSynchronizer 超詳細(xì)原理解析 - 后端 - 掘金今天我們來研究學(xué)習(xí)一下AbstractQueuedSynchronizer類的相關(guān)原理,java.util.concurrent包中很多類都依賴于這個(gè)類所提供的隊(duì)列式...

    fantix 評論0 收藏0
  • 高并發(fā)

    摘要:表示的是兩個(gè),當(dāng)其中任意一個(gè)計(jì)算完并發(fā)編程之是線程安全并且高效的,在并發(fā)編程中經(jīng)??梢娝氖褂茫陂_始分析它的高并發(fā)實(shí)現(xiàn)機(jī)制前,先講講廢話,看看它是如何被引入的。電商秒殺和搶購,是兩個(gè)比較典型的互聯(lián)網(wǎng)高并發(fā)場景。 干貨:深度剖析分布式搜索引擎設(shè)計(jì) 分布式,高可用,和機(jī)器學(xué)習(xí)一樣,最近幾年被提及得最多的名詞,聽名字多牛逼,來,我們一步一步來擊破前兩個(gè)名詞,今天我們首先來說說分布式。 探究...

    supernavy 評論0 收藏0
  • 高并發(fā)

    摘要:表示的是兩個(gè),當(dāng)其中任意一個(gè)計(jì)算完并發(fā)編程之是線程安全并且高效的,在并發(fā)編程中經(jīng)??梢娝氖褂?,在開始分析它的高并發(fā)實(shí)現(xiàn)機(jī)制前,先講講廢話,看看它是如何被引入的。電商秒殺和搶購,是兩個(gè)比較典型的互聯(lián)網(wǎng)高并發(fā)場景。 干貨:深度剖析分布式搜索引擎設(shè)計(jì) 分布式,高可用,和機(jī)器學(xué)習(xí)一樣,最近幾年被提及得最多的名詞,聽名字多牛逼,來,我們一步一步來擊破前兩個(gè)名詞,今天我們首先來說說分布式。 探究...

    ddongjian0000 評論0 收藏0

發(fā)表評論

0條評論

最新活動(dòng)
閱讀需要支付1元查看
<