溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Java互斥的"等待-通知"機(jī)制

發(fā)布時間:2021-08-26 15:29:45 來源:億速云 閱讀:136 作者:chen 欄目:大數(shù)據(jù)

這篇文章主要介紹“Java互斥的"等待-通知"機(jī)制”,在日常操作中,相信很多人在Java互斥的"等待-通知"機(jī)制問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Java互斥的"等待-通知"機(jī)制”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

話不多說咱們先看一段代碼哈哈哈

Java互斥的"等待-通知"機(jī)制

這段代碼的意思就是我們?nèi)バ姓?wù)中心辦護(hù)照,工作人員A來服務(wù)我們,我們需要給他我們的身份證才能辦理對吧,辦好之后付了錢才會生效。

因為A同一時刻只能服務(wù)一個人,所以我們給A加了個鎖。但是上面代碼有一點(diǎn)不符合我們的現(xiàn)實邏輯,

Java互斥的"等待-通知"機(jī)制

就是這一段代碼,就是說如果你排隊叫號,叫到你了你去柜臺,發(fā)現(xiàn)你沒帶身份證,那正常情況下就是你得會回家拿身份證,工作人員A是不會讓你占著位置等你的,而是會叫下一號。如果不叫下一號等你回家拿身份證來效率多低???那放在我們代碼里面也是一樣的!

所以如何提高效率呢?這就引入了"等待-通知"機(jī)制了!

我們改造下上面的類A

Java互斥的"等待-通知"機(jī)制

經(jīng)過這個改造就符合我們的正常情況了!但你去了柜臺發(fā)現(xiàn)你沒身份證,工作人員告訴你不好意思你回去拿吧(wait)!就是讓你去一邊等著去,下一位!

翻譯到j(luò)ava中就是,你這個線程來執(zhí)行辦理護(hù)照,但是你不滿足條件所以你就一邊等著(解鎖了),不要阻塞著大家!這樣效率就提高了很多了!然后等一個人辦理好之后就是通知一下那些等待的線程,看看你們現(xiàn)在帶身份證了沒?如果帶來再來排隊!

咱們再深入的剖析一下這個流程

Java互斥的"等待-通知"機(jī)制

就是我們被鎖的方法就會被統(tǒng)一包起來!所有的進(jìn)出都被synchroinzed 把控了。

等待對列就是存放那些等待的想進(jìn)入這個臨界區(qū)的線程們,條件變量就是對應(yīng)著我們上面代碼的IdCard,調(diào)用了wait()就表示不滿足我們的條件,所以讓當(dāng)前線程進(jìn)去條件變量等待對列!

再調(diào)用notifyAll()表面現(xiàn)在條件滿足了!然后那些條件對待對列中的所有線程出去到等待對列中排隊了!

這里說說為什么用notifyAll()而不是notify(),因為notify()是隨機(jī)喚醒一個條件變量等待對列中的線程去讓他們出去繼續(xù)排隊!那就是有可能一些線程永遠(yuǎn)不會被通知到!那不玩完了么?所以推薦使用notifyAll();

還有一點(diǎn)我們用了

Java互斥的"等待-通知"機(jī)制

為什么加了個while循環(huán)再一次對條件進(jìn)行判斷呢?

因為notifyAll()的時候你的條件是滿足的!但是你又出去排隊了,那指不定排隊輪到你的之后條件又不滿足了!所以需要加個while循環(huán)!

還有如果你用的是Lock其實也是一樣的意思!

所以引入了"等待-通知"機(jī)制提高了我們代碼執(zhí)行的效率!

到此,關(guān)于“Java互斥的"等待-通知"機(jī)制”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI