java鎖機(jī)制之「wait」和「notify」

關(guān)鍵字

鎖通信 wait notify

我們知道java線程一共有6種狀態(tài)砰识,分別是NEW柱搜、RUNABLE脂信、BLOCKED癣蟋、WAITINGTIMED_WATING狰闪、TERMINATED疯搅。而線程之前的狀態(tài)切換,其中一個(gè)方式就是靠wait()埋泵、notify()機(jī)制實(shí)現(xiàn)幔欧。
wait/notify機(jī)制 類似一種生產(chǎn)者-消費(fèi)者模型。 當(dāng)一個(gè)線程在獲取到資源的鎖后丽声,發(fā)現(xiàn)該資源不滿足使用條件礁蔗,就會(huì)調(diào)用wait()方法,等待該資源滿足條件后再繼續(xù)執(zhí)行雁社。 而notify()則類似生產(chǎn)者浴井,如果資源滿足條件了,則通過調(diào)用notify()霉撵,隨機(jī)的喚醒一個(gè)之前等待的線程磺浙,通知其條件已滿足,可以繼續(xù)執(zhí)行徒坡。

定義

wait() notify()是Object類中的兩個(gè)本地方法撕氧。對(duì)于wait()方法,解釋如下:
我們假設(shè)一個(gè)資源為object崭参。如果一個(gè)線程調(diào)用了資源object的wait()方法呵曹,那么將會(huì)發(fā)生如下事情:

  • 線程進(jìn)入到object的等待隊(duì)列(wait set),使自身由runable變?yōu)榱藈aiting狀態(tài)何暮。
  • 釋放持有的object鎖奄喂。
  • 等待其他線程調(diào)用object的notify、notifyAll方法才會(huì)被再次喚醒海洼。

喚醒之后跨新,線程則又變?yōu)榭烧{(diào)度狀態(tài),然后需要同其他線程再次去競爭object資源的鎖坏逢。一旦獲取到鎖之后域帐,線程就會(huì)完全恢復(fù)赘被,繼續(xù)從object.wait()之后的代碼開始執(zhí)行。
由于我們一般是因?yàn)椴粷M足某些條件肖揣,才會(huì)調(diào)用wait方法等待民假,因此在線程恢復(fù)執(zhí)行后,我們總是應(yīng)該再次去check一下條件是否滿足龙优。這是因?yàn)檫@樣羊异,我們總是在一個(gè)循環(huán)中觸發(fā)wait()方法,類似:

           synchronized (obj) {
               while (<條件不滿足>)
                   obj.wait(timeout);
               ... // 條件已滿足彤断,開始執(zhí)行相應(yīng)的業(yè)務(wù)邏輯
           }

notify方法則是用來從object的等待隊(duì)列里野舶,隨機(jī)的喚醒一個(gè)線程。被喚醒的線程再去競爭獲取object的鎖宰衙,然后繼續(xù)執(zhí)行平道。

整個(gè)運(yùn)作機(jī)制可以簡單用下圖來表示:


wait/notify

說明

無論是wait()還是notify(),其執(zhí)行的前提條件都是:該線程首先持有資源對(duì)象object的鎖供炼。否則的話一屋,就會(huì)拋出IllegalMonitorStateException異常。
wait(long timeout):和wait()方法類似的還有一個(gè)wait(long timeout)袋哼,如果線程一直沒有被喚醒陆淀,當(dāng)超時(shí)時(shí)間到了,就會(huì)自動(dòng)被喚醒先嬉。
notifyAll():notify()方法轧苫,也對(duì)應(yīng)有一個(gè)notifyAll()方法,該方法會(huì)將等待隊(duì)列里的所有線程都喚醒疫蔓,喚醒后的線程行為和notify()保持一致含懊。

事實(shí)上一個(gè)線程被喚醒的方式包括以下幾種:

  • 其他線程調(diào)用object的notify()方法, 而該線程剛好被從等待隊(duì)列中選中.
  • 其他線程調(diào)用了notifyAll()方法衅胀。
  • 其他線程通過interrupt中斷了該線程岔乔。
  • 等待超時(shí)時(shí)間到達(dá),線程被自動(dòng)喚醒滚躯。

剛剛上文也提到了執(zhí)行notify和wait雏门,必須先獲取到資源對(duì)象的鎖,獲取鎖的方式有三種:

  • 執(zhí)行對(duì)象的同步方法掸掏。
  • 執(zhí)行對(duì)象的同步代碼塊茁影。
  • 對(duì)于類對(duì)象,執(zhí)行類的靜態(tài)同步方法丧凤。

參考文獻(xiàn)

http://www.reibang.com/p/9ac697c166f3
http://www.reibang.com/p/1dafbf42cc54

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末募闲,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子愿待,更是在濱河造成了極大的恐慌浩螺,老刑警劉巖靴患,帶你破解...
    沈念sama閱讀 222,464評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異要出,居然都是意外死亡鸳君,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,033評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門患蹂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來相嵌,“玉大人,你說我怎么就攤上這事况脆。” “怎么了批糟?”我有些...
    開封第一講書人閱讀 169,078評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵格了,是天一觀的道長。 經(jīng)常有香客問我徽鼎,道長盛末,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,979評(píng)論 1 299
  • 正文 為了忘掉前任否淤,我火速辦了婚禮悄但,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘石抡。我一直安慰自己檐嚣,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,001評(píng)論 6 398
  • 文/花漫 我一把揭開白布啰扛。 她就那樣靜靜地躺著嚎京,像睡著了一般。 火紅的嫁衣襯著肌膚如雪隐解。 梳的紋絲不亂的頭發(fā)上鞍帝,一...
    開封第一講書人閱讀 52,584評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音煞茫,去河邊找鬼帕涌。 笑死,一個(gè)胖子當(dāng)著我的面吹牛续徽,可吹牛的內(nèi)容都是我干的蚓曼。 我是一名探鬼主播,決...
    沈念sama閱讀 41,085評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼钦扭,長吁一口氣:“原來是場噩夢啊……” “哼辟躏!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起土全,我...
    開封第一講書人閱讀 40,023評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤捎琐,失蹤者是張志新(化名)和其女友劉穎会涎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體瑞凑,經(jīng)...
    沈念sama閱讀 46,555評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡末秃,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,626評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了籽御。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片练慕。...
    茶點(diǎn)故事閱讀 40,769評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖技掏,靈堂內(nèi)的尸體忽然破棺而出铃将,到底是詐尸還是另有隱情,我是刑警寧澤哑梳,帶...
    沈念sama閱讀 36,439評(píng)論 5 351
  • 正文 年R本政府宣布劲阎,位于F島的核電站,受9級(jí)特大地震影響鸠真,放射性物質(zhì)發(fā)生泄漏悯仙。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,115評(píng)論 3 335
  • 文/蒙蒙 一吠卷、第九天 我趴在偏房一處隱蔽的房頂上張望锡垄。 院中可真熱鬧,春花似錦祭隔、人聲如沸货岭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,601評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽茴她。三九已至,卻和暖如春程奠,著一層夾襖步出監(jiān)牢的瞬間丈牢,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,702評(píng)論 1 274
  • 我被黑心中介騙來泰國打工瞄沙, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留己沛,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,191評(píng)論 3 378
  • 正文 我出身青樓距境,卻偏偏與公主長得像申尼,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子垫桂,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,781評(píng)論 2 361

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