java notify和notifyAll的對(duì)比
java notify和notifyAll
首先從名字可以了解,notify是通知一個(gè)線程獲取鎖,notifyAll是通知所有相關(guān)的線程去競(jìng)爭(zhēng)鎖。
notify不能保證獲得鎖的線程,真正需要鎖,并且可能產(chǎn)生死鎖。
舉例1:
所有人(消費(fèi)者線程)準(zhǔn)備吃飯,食堂沒(méi)有開放(沒(méi)有釋放鎖)打飯窗口(鎖),所有人等待(WAITING)。
食堂開飯打飯窗口(釋放鎖),并廣播消息“開飯了”(notifyAll),所有人競(jìng)爭(zhēng)排隊(duì),并等待吃飯(BLOCKED)。每一個(gè)人依次在打飯窗口(獲得鎖)打飯(RUNNABLE)。如果想吃飯就打完飯后離開(釋放鎖),不想吃飯就直接離開(釋放鎖)。如果吃完了還想吃,就主動(dòng)等待下一次“開飯了”的消息(wait)。
食堂通知一個(gè)人來(lái)吃飯(notify),此人來(lái)到打飯窗口(獲得鎖)打飯(RUNNABLE),其他人都在等待開飯的消息(WAITING)。如果想吃飯就打完飯后離開(釋放鎖),不想吃飯就直接離開(釋放鎖)。如果吃完了還想吃,就主動(dòng)等待下一次“開飯”的消息(WAITING)。
notify不能保證通知到真正想吃飯的人。
舉例2:
兩個(gè)生產(chǎn)者P1、P2,兩個(gè)消費(fèi)者C1、C2,共同操作一個(gè)隊(duì)列,隊(duì)列最大長(zhǎng)度為1。
開始P1、P2、C1、C2都處于運(yùn)行狀態(tài)(RUNNABLE)。
C1先獲得鎖,P1、P2、C2為BLOCKED狀態(tài)。C1發(fā)現(xiàn)隊(duì)列為空,主動(dòng)進(jìn)入WAITING。C2接著獲得鎖,成為RUNNABLE狀態(tài),發(fā)現(xiàn)隊(duì)列為空,主動(dòng)進(jìn)入WAITING。
P1接著獲得鎖,成為RUNNABLE狀態(tài),在隊(duì)列中插入一個(gè)元素,notify到了另一個(gè)生產(chǎn)者P2。P1循環(huán)生產(chǎn),發(fā)現(xiàn)隊(duì)列不為空,成為WAITING。
P2成為RUNNABLE狀態(tài),發(fā)現(xiàn)隊(duì)列有值,主動(dòng)進(jìn)入WAITING。
此時(shí)鎖已被釋放,但P1、P2、C1、C2都處于WAITING狀態(tài),沒(méi)有線程去獲取鎖,死了。
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
相關(guān)文章
Java多線程之并發(fā)編程的基石CAS機(jī)制詳解
這篇文章主要介紹了java并發(fā)編程之cas詳解,涉及cas使用場(chǎng)景和cas用作原子操作等內(nèi)容,具有一定參考價(jià)值,需要的朋友可以了解下2021-09-09
詳解在Spring Boot框架下使用WebSocket實(shí)現(xiàn)消息推送
這篇文章主要介紹了詳解在Spring Boot框架下使用WebSocket實(shí)現(xiàn)消息推送,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2016-12-12
Java8需要知道的4個(gè)函數(shù)式接口簡(jiǎn)單教程
這篇文章主要介紹了Java?8中引入的函數(shù)式接口,包括Consumer、Supplier、Predicate和Function,以及它們的用法和特點(diǎn),文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-03-03
解決springmvc項(xiàng)目中使用過(guò)濾器來(lái)解決請(qǐng)求方式為post時(shí)出現(xiàn)亂碼的問(wèn)題
這篇文章主要介紹了springmvc項(xiàng)目中使用過(guò)濾器來(lái)解決請(qǐng)求方式為post時(shí)出現(xiàn)亂碼的問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08
詳解Java使用JDBC連接MySQL數(shù)據(jù)庫(kù)
本文詳細(xì)講解了Java使用JDBC連接MySQL數(shù)據(jù)庫(kù)的方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-01-01
Java利用FileUtils讀取數(shù)據(jù)和寫入數(shù)據(jù)到文件
這篇文章主要介紹了Java利用FileUtils讀取數(shù)據(jù)和寫入數(shù)據(jù)到文件,下面文章圍繞FileUtils的相關(guān)資料展開怎么讀取數(shù)據(jù)和寫入數(shù)據(jù)到文件的內(nèi)容,具有一定的參考價(jià)值,徐婭奧德小伙伴可以參考一下2021-12-12
基于FeignClient調(diào)用超時(shí)的處理方案
這篇文章主要介紹了基于FeignClient調(diào)用超時(shí)的處理方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07
IDEA設(shè)置字體隨鼠標(biāo)滾動(dòng)放大縮小的實(shí)現(xiàn)
這篇文章主要介紹了IDEA設(shè)置字體隨鼠標(biāo)滾動(dòng)放大縮小的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01

