java Object.wait notify等待通知機(jī)制的理解

在java多線程中可以使用object.wait/notify來(lái)進(jìn)行線程之間的通訊 wait會(huì)使當(dāng)前線程進(jìn)入等待狀態(tài),notify會(huì)從等待線程中隨機(jī)解除其等待狀態(tài)

注意:

  • 使用wait 必須進(jìn)行try catch
  • 記住調(diào)用wait或者notify方法必須采用當(dāng)前鎖調(diào)用,即必須采用synchronized中的對(duì)象歌懒,wait的本意是暫時(shí)釋放掉對(duì)象鎖嚼吞,讓別的需要此對(duì)象的代碼能夠有機(jī)會(huì)執(zhí)行。

舉個(gè)例子

當(dāng)線程B訪問(wèn)某個(gè)共享資源時(shí),想獲取資源的鎖對(duì)象狂男,發(fā)現(xiàn)這個(gè)鎖已經(jīng)被線程A拿到了埠忘,這個(gè)時(shí)候脾拆,線程B只能被掛起,等待線程A釋放鎖莹妒。
但是拿到鎖的線程A在執(zhí)行的過(guò)程中假丧,因?yàn)槟承l件還不滿足,暫時(shí)不想繼續(xù)執(zhí)行下去动羽,想先等待一下(注意:是已經(jīng)拿到鎖的線程A自己想主動(dòng)等待的)包帚,希望等到某個(gè)條件滿足后,繼續(xù)執(zhí)行任務(wù)运吓。在同步代碼塊里渴邦,線程A必須先釋放鎖,線程B才有資格獲取鎖拘哨,進(jìn)入同步代碼塊谋梭,執(zhí)行代碼。等線程B執(zhí)行完后倦青,線程A需要的條件已經(jīng)滿足瓮床,那么這個(gè)時(shí)候必須有一個(gè)通知機(jī)制,讓線程A從等待狀態(tài)變成執(zhí)行狀態(tài),繼續(xù)執(zhí)行代碼隘庄。

所以線程之間要協(xié)調(diào)溝通踢步,必須有一個(gè)等待機(jī)制和通知機(jī)制,在JAVA里面丑掺,對(duì)應(yīng)的就是wait方法和notify方法获印。

Object的wait方法

 synchronized (obj) {
        while (condition does not ok){
               obj.wait();
         }
    }

如果想讓線程A處于等待狀態(tài),可以調(diào)用當(dāng)前對(duì)象wait方法街州。wait方法一旦被調(diào)用兼丰,也就意味著:線程A已經(jīng)獲得鎖了,而且能做的事情都已經(jīng)做了唆缴,現(xiàn)在只能等待了鳍征,等待另外的同步操作執(zhí)行某些代碼后,我才回來(lái)繼續(xù)干活面徽。

注意:

永遠(yuǎn)不要在循環(huán)之外調(diào)用wait方法
對(duì)于從wait中被notify的進(jìn)程來(lái)說(shuō)蟆技,它在被notify之后還需要重新檢查是否符合執(zhí)行條件,如果不符合斗忌,就必須再次被wait质礼,如果符合才能往下執(zhí)行。所以:wait方法應(yīng)該使用循環(huán)模式來(lái)調(diào)用织阳。按照上面的生產(chǎn)者和消費(fèi)者問(wèn)題來(lái)說(shuō):錯(cuò)誤情況一:如果有兩個(gè)生產(chǎn)者A和B眶蕉,一個(gè)消費(fèi)者C。當(dāng)存儲(chǔ)空間滿了之后唧躲,生產(chǎn)者A和B都被wait造挽,進(jìn)入等待喚醒隊(duì)列。當(dāng)消費(fèi)者C取走了一個(gè)數(shù)據(jù)后弄痹,如果調(diào)用了notifyAll()饭入,注意,此處是調(diào)用notifyAll()肛真,則生產(chǎn)者線程A和B都將被喚醒谐丢,如果此時(shí)A和B中的wait不在while循環(huán)中而是在if中,則A和B就不會(huì)再次判斷是否符合執(zhí)行條件蚓让,都將直接執(zhí)行wait()之后的程序乾忱,那么如果A放入了一個(gè)數(shù)據(jù)至存儲(chǔ)空間,則此時(shí)存儲(chǔ)空間已經(jīng)滿了历极;但是B還是會(huì)繼續(xù)往存儲(chǔ)空間里放數(shù)據(jù)窄瘟,錯(cuò)誤便產(chǎn)生了。錯(cuò)誤情況二:如果有兩個(gè)生產(chǎn)者A和B趟卸,一個(gè)消費(fèi)者C蹄葱。當(dāng)存儲(chǔ)空間滿了之后氏义,生產(chǎn)者A和B都被wait,進(jìn)入等待喚醒隊(duì)列图云。當(dāng)消費(fèi)者C取走了一個(gè)數(shù)據(jù)后惯悠,如果調(diào)用了notify(),則A和B中的一個(gè)將被喚醒琼稻,假設(shè)A被喚醒,則A向存儲(chǔ)空間放入了一個(gè)數(shù)據(jù)饶囚,至此空間就滿了帕翻。A執(zhí)行了notify()之后,如果喚醒了B萝风,那么B不會(huì)再次判斷是否符合執(zhí)行條件嘀掸,將直接執(zhí)行wait()之后的程序,這樣就導(dǎo)致向已經(jīng)滿了數(shù)據(jù)存儲(chǔ)區(qū)中再次放入數(shù)據(jù)规惰。錯(cuò)誤產(chǎn)生睬塌。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市歇万,隨后出現(xiàn)的幾起案子揩晴,更是在濱河造成了極大的恐慌,老刑警劉巖贪磺,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件硫兰,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡寒锚,警方通過(guò)查閱死者的電腦和手機(jī)劫映,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)刹前,“玉大人泳赋,你說(shuō)我怎么就攤上這事±恚” “怎么了祖今?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)拣技。 經(jīng)常有香客問(wèn)我衅鹿,道長(zhǎng),這世上最難降的妖魔是什么过咬? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任大渤,我火速辦了婚禮,結(jié)果婚禮上掸绞,老公的妹妹穿的比我還像新娘泵三。我一直安慰自己耕捞,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布烫幕。 她就那樣靜靜地躺著俺抽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪较曼。 梳的紋絲不亂的頭發(fā)上磷斧,一...
    開(kāi)封第一講書(shū)人閱讀 49,144評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音捷犹,去河邊找鬼弛饭。 笑死,一個(gè)胖子當(dāng)著我的面吹牛萍歉,可吹牛的內(nèi)容都是我干的侣颂。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼枪孩,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼憔晒!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起蔑舞,我...
    開(kāi)封第一講書(shū)人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤拒担,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后攻询,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體澎蛛,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年蜕窿,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了谋逻。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡桐经,死狀恐怖毁兆,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情阴挣,我是刑警寧澤气堕,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站畔咧,受9級(jí)特大地震影響茎芭,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜誓沸,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一梅桩、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧拜隧,春花似錦宿百、人聲如沸趁仙。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)雀费。三九已至,卻和暖如春痊焊,著一層夾襖步出監(jiān)牢的瞬間盏袄,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工薄啥, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留辕羽,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓罪佳,卻偏偏與公主長(zhǎng)得像逛漫,于是被迫代替她去往敵國(guó)和親黑低。 傳聞我的和親對(duì)象是個(gè)殘疾皇子赘艳,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 1.解決信號(hào)量丟失和假喚醒 public class MyWaitNotify3{ MonitorObject m...
    Q羅閱讀 871評(píng)論 0 1
  • 相關(guān)概念 面向?qū)ο蟮娜齻€(gè)特征 封裝,繼承,多態(tài).這個(gè)應(yīng)該是人人皆知.有時(shí)候也會(huì)加上抽象. 多態(tài)的好處 允許不同類對(duì)...
    東經(jīng)315度閱讀 1,925評(píng)論 0 8
  • 一、多線程 說(shuō)明下線程的狀態(tài) java中的線程一共有 5 種狀態(tài)克握。 NEW:這種情況指的是蕾管,通過(guò) New 關(guān)鍵字創(chuàng)...
    Java旅行者閱讀 4,659評(píng)論 0 44
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類相關(guān)的語(yǔ)法菩暗,內(nèi)部類的語(yǔ)法掰曾,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法旷坦,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 31,587評(píng)論 18 399
  • 民政局門口,許夏捏緊手里的那枚紅本佑稠,她記得電視劇中看到的離婚證都是綠本秒梅,五年戀愛(ài),十二年婚姻舌胶,結(jié)束一切捆蜀,只用了十分...
    夢(mèng)谷閱讀 199評(píng)論 0 1