淺談Java 線程阻塞及導(dǎo)致原理

Java 線程機制

Java淘钟、Thread線程阻塞method

解析Java Thread 類方法

  • sleep()

  • suspend()

  • resume()

  • yield()

  • wait()

  • notify()

線程的阻塞

線程的阻塞發(fā)生原因是什么比原?

  • 為了解決對共享存儲區(qū)的訪問沖突,Java 引入了同步機制,現(xiàn)在讓我們來考察多個線程對共享資源的訪問,顯然同步機制已經(jīng)不夠了舆驶,因為在任意時刻所要求的資源不一定已經(jīng)準(zhǔn)備好了被訪問,反過來而钞,同一時刻準(zhǔn)備好了的資源也可能不止一個沙廉。為了解決這種情況下的訪問控制問題,Java 引入了對阻塞機制的支持臼节。

什么是線程阻塞撬陵?

  • 阻塞指的是暫停一個線程的執(zhí)行以等待某個條件發(fā)生(如某資源就緒),學(xué)過操作系統(tǒng)的同學(xué)對它一定已經(jīng)很熟悉了官疲。Java 提供了大量方法來支持阻塞袱结,下面讓我們逐一分析亮隙。

Thread方法解析

  • sleep() 方法:sleep()允許 指定以毫秒為單位的一段時間作為參數(shù)途凫,它使得線程在指定的時間內(nèi)進入阻塞狀態(tài)是牢,不能得到CPU 時間笛厦,指定的時間一過,線程重新進入可執(zhí)行狀態(tài)员萍。 典型的sleep() 被用在等待某個資源就緒的情形:測試發(fā)現(xiàn)條件不滿足后促王,讓線程阻塞一段時間后重新測試犀盟,直到條件滿足為止。

  • suspend() 和 resume() 方法:兩個方法配套使用蝇狼,suspend()使得線程進入阻塞狀態(tài)阅畴,并且不會自動恢復(fù),必須其對應(yīng)的resume() 被調(diào)用迅耘,才能使得線程重新進入可執(zhí)行狀態(tài)贱枣。典型的suspend()resume() 被用在等待另一個線程產(chǎn)生的結(jié)果的情形:測試發(fā)現(xiàn)結(jié)果還沒有產(chǎn)生后,讓線程阻塞颤专,另一個線程產(chǎn)生了結(jié)果后纽哥,調(diào)用 resume() 使其恢復(fù)。

  • yield() 方法:yield() 使得線程放棄當(dāng)前分得的 CPU 時間栖秕,但是不使線程阻塞春塌,即線程仍處于可執(zhí)行狀態(tài),隨時可能再次分得 CPU 時間。調(diào)用 yield() 的效果等價于調(diào)度程序認(rèn)為該線程已執(zhí)行了足夠的時間從而轉(zhuǎn)到另一個線程.

  • wait() 和 notify() 方法:兩個方法配套使用只壳,wait() 使得線程進入阻塞狀態(tài)俏拱,它有兩種形式,一種允許 指定以毫秒為單位的一段時間作為參數(shù)吼句,另一種沒有參數(shù)彰触,前者當(dāng)對應(yīng)的 notify() 被調(diào)用或者超出指定時間時線程重新進入可執(zhí)行狀態(tài),后者則必須對應(yīng)的 notify() 被調(diào)用命辖。

方法概述

  • 首先况毅,前面敘述的所有方法都隸屬于 Thread 類,但是這一對卻直接隸屬于 Object 類尔艇,也就是說尔许,所有對象都擁有這一對方法。初看起來這十分不可思議终娃,但是實際上卻是很自然的味廊,因為這一對方法阻塞時要釋放占用的鎖,而鎖是任何對象都具有的棠耕,調(diào)用任意對象的 wait() 方法導(dǎo)致線程阻塞余佛,并且該對象上的鎖被釋放。而調(diào)用 任意對象的notify()方法則導(dǎo)致因調(diào)用該對象的 wait() 方法而阻塞的線程中隨機選擇的一個解除阻塞(但要等到獲得鎖后才真正可執(zhí)行)窍荧。

  • 其次辉巡,前面敘述的所有方法都可在任何位置調(diào)用,但是這一對方法卻必須在 synchronized 方法或塊中調(diào)用蕊退,理由也很簡單郊楣,只有在synchronized 方法或塊中當(dāng)前線程才占有鎖,才有鎖可以釋放瓤荔。同樣的道理净蚤,調(diào)用這一對方法的對象上的鎖必須為當(dāng)前線程所擁有,這樣才有鎖可以釋放输硝。因此今瀑,這一對方法調(diào)用必須放置在這樣的 synchronized 方法或塊中,該方法或塊的上鎖對象就是調(diào)用這一對方法的對象点把。若不滿足這一條件橘荠,則程序雖然仍能編譯,但在運行時會出現(xiàn)IllegalMonitorStateException 異常愉粤。

關(guān)于 wait() 和 notify() 方法最后再說明兩點:

  • 調(diào)用 notify() 方法導(dǎo)致解除阻塞的線程是從因調(diào)用該對象的 wait() 方法而阻塞的線程中隨機選取的砾医,我們無法預(yù)料哪一個線程將會被選擇,所以編程時要特別小心衣厘,避免因這種不確定性而產(chǎn)生問題如蚜。

  • 除了 notify()压恒,還有一個方法 notifyAll() 也可起到類似作用,唯一的區(qū)別在于错邦,調(diào)用 notifyAll() 方法將把因調(diào)用該對象的 wait() 方法而阻塞的所有線程一次性全部解除阻塞探赫。當(dāng)然,只有獲得鎖的那一個線程才能進入可執(zhí)行狀態(tài)撬呢。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末伦吠,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子魂拦,更是在濱河造成了極大的恐慌毛仪,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件芯勘,死亡現(xiàn)場離奇詭異箱靴,居然都是意外死亡,警方通過查閱死者的電腦和手機荷愕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進店門衡怀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人安疗,你說我怎么就攤上這事抛杨。” “怎么了荐类?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵怖现,是天一觀的道長。 經(jīng)常有香客問我掉冶,道長真竖,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任厌小,我火速辦了婚禮,結(jié)果婚禮上战秋,老公的妹妹穿的比我還像新娘璧亚。我一直安慰自己,他們只是感情好脂信,可當(dāng)我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布癣蟋。 她就那樣靜靜地躺著,像睡著了一般狰闪。 火紅的嫁衣襯著肌膚如雪疯搅。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天埋泵,我揣著相機與錄音幔欧,去河邊找鬼罪治。 笑死,一個胖子當(dāng)著我的面吹牛礁蔗,可吹牛的內(nèi)容都是我干的觉义。 我是一名探鬼主播,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼浴井,長吁一口氣:“原來是場噩夢啊……” “哼晒骇!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起磺浙,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤洪囤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后撕氧,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體箍鼓,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年呵曹,在試婚紗的時候發(fā)現(xiàn)自己被綠了款咖。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡奄喂,死狀恐怖铐殃,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情跨新,我是刑警寧澤富腊,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站域帐,受9級特大地震影響赘被,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜肖揣,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一民假、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧龙优,春花似錦羊异、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至宰衙,卻和暖如春平道,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背供炼。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工一屋, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留窘疮,地道東北人。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓陆淀,卻偏偏與公主長得像考余,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子轧苫,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,914評論 2 355

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