首頁  >  文章  >  Java  >  java notify和notifyAll的比較詳細介紹

java notify和notifyAll的比較詳細介紹

黄舟
黄舟原創
2017-03-18 10:09:121737瀏覽

這篇文章主要介紹了java notifynotifyAll的對比的相關資料,需要的朋友可以參考下

 java notify和notifyAll

首先從名字可以了解,notify是通知一個執行緒取得鎖,notifyAll是通知所有相關的執行緒去競爭鎖。

notify不能保證獲得鎖的線程,真正需要鎖,並且可能產生死鎖

舉例1:

所有人(消費者線程)準備吃飯,食堂沒有開放(沒有釋放鎖)吃飯窗口(鎖),所有人等待( WAITING)。

食堂開飯打飯窗口(釋放鎖),並廣播訊息「開飯了」(notifyAll),所有人競爭排隊,並等待吃飯(BLOCKED)。每一個人依序在打飯窗口(獲得鎖)打飯(RUNNABLE)。如果想吃飯就打完飯後離開(釋放鎖),不想吃飯就直接離開(釋放鎖)。如果吃完了還想吃,就主動等待下一次「開飯了」的訊息(wait)。

食堂通知一個人來吃飯(notify),此人來到打飯窗口(獲得鎖)打飯(RUNNABLE),其他人都在等待開飯的消息(WAITING)。如果想吃飯就打完飯後離開(釋放鎖),不想吃飯就直接離開(釋放鎖)。如果吃完了還想吃,就主動等待下一次「開飯」的訊息(WAITING)。
notify不能保證通知真正想吃飯的人。

範例2:

兩個生產者P1、P2,兩個消費者C1、C2,共同操作一個佇列,佇列最大長度為1。

開始P1、P2、C1、C2都處於運作狀態(RUNNABLE)。

C1先取得鎖,P1、P2、C2為BLOCKED狀態。 C1發現佇列為空,主動進入WAITING。 C2接著取得鎖,成為RUNNABLE狀態,發現佇列為空,主動進入WAITING。

P1接著取得鎖,成為RUNNABLE狀態,在佇列中插入一個元素,notify到了另一個生產者P2。 P1循環生產,發現佇列不為空,成為WAITING。

P2成為RUNNABLE狀態,發現佇列有值,主動進入WAITING。

此時鎖定已被釋放,但P1、P2、C1、C2都處於WAITING狀態,沒有執行緒去取得鎖,死了。

相關文章:

java並發之線程間協作的兩種方式:wait、notify、notifyAll和Condition

wait, notify 和notifyAll的正確用法

透過實例討論notify()和notifyAll()的本質區別

以上是java notify和notifyAll的比較詳細介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn