您好,登錄后才能下訂單哦!
這篇文章主要介紹“Java互斥的"等待-通知"機制”,在日常操作中,相信很多人在Java互斥的"等待-通知"機制問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Java互斥的"等待-通知"機制”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
話不多說咱們先看一段代碼哈哈哈
這段代碼的意思就是我們去行政服務中心辦護照,工作人員A來服務我們,我們需要給他我們的身份證才能辦理對吧,辦好之后付了錢才會生效。
因為A同一時刻只能服務一個人,所以我們給A加了個鎖。但是上面代碼有一點不符合我們的現實邏輯,
就是這一段代碼,就是說如果你排隊叫號,叫到你了你去柜臺,發現你沒帶身份證,那正常情況下就是你得會回家拿身份證,工作人員A是不會讓你占著位置等你的,而是會叫下一號。如果不叫下一號等你回家拿身份證來效率多低啊?那放在我們代碼里面也是一樣的!
所以如何提高效率呢?這就引入了"等待-通知"機制了!
我們改造下上面的類A
經過這個改造就符合我們的正常情況了!但你去了柜臺發現你沒身份證,工作人員告訴你不好意思你回去拿吧(wait)!就是讓你去一邊等著去,下一位!
翻譯到java中就是,你這個線程來執行辦理護照,但是你不滿足條件所以你就一邊等著(解鎖了),不要阻塞著大家!這樣效率就提高了很多了!然后等一個人辦理好之后就是通知一下那些等待的線程,看看你們現在帶身份證了沒?如果帶來再來排隊!
咱們再深入的剖析一下這個流程
就是我們被鎖的方法就會被統一包起來!所有的進出都被synchroinzed 把控了。
等待對列就是存放那些等待的想進入這個臨界區的線程們,條件變量就是對應著我們上面代碼的IdCard,調用了wait()就表示不滿足我們的條件,所以讓當前線程進去條件變量等待對列!
再調用notifyAll()表面現在條件滿足了!然后那些條件對待對列中的所有線程出去到等待對列中排隊了!
這里說說為什么用notifyAll()而不是notify(),因為notify()是隨機喚醒一個條件變量等待對列中的線程去讓他們出去繼續排隊!那就是有可能一些線程永遠不會被通知到!那不玩完了么?所以推薦使用notifyAll();
還有一點我們用了
為什么加了個while循環再一次對條件進行判斷呢?
因為notifyAll()的時候你的條件是滿足的!但是你又出去排隊了,那指不定排隊輪到你的之后條件又不滿足了!所以需要加個while循環!
還有如果你用的是Lock其實也是一樣的意思!
所以引入了"等待-通知"機制提高了我們代碼執行的效率!
到此,關于“Java互斥的"等待-通知"機制”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。