溫馨提示×

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

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

java notify和notifyAll的對(duì)比

發(fā)布時(shí)間:2020-09-11 02:59:13 來(lái)源:腳本之家 閱讀:145 作者:lqh 欄目:編程語(yǔ)言

 java notify和notifyAll

首先從名字可以了解,notify是通知一個(gè)線程獲取鎖,notifyAll是通知所有相關(guān)的線程去競(jìng)爭(zhēng)鎖。

notify不能保證獲得鎖的線程,真正需要鎖,并且可能產(chǎn)生死鎖。

舉例1:

所有人(消費(fèi)者線程)準(zhǔn)備吃飯,食堂沒有開放(沒有釋放鎖)打飯窗口(鎖),所有人等待(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),沒有線程去獲取鎖,死了。

感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!

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

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

AI