摘要:在從返回前,線程與其他線程競爭重新獲得鎖。就緒隊列存儲了將要獲得鎖的線程,阻塞隊列存儲了被阻塞的線程。當線程呈狀態(tài),調(diào)用線程對象的方法會出現(xiàn)異常。在執(zhí)行同步代碼塊過程中,遇到異常而導致線程終止,鎖也會被釋放。
方法wait()的作用是使當前執(zhí)行代碼的線程進行等待,wait()方法是Object類的方法,該方法用來將當前線程置入"預執(zhí)行隊列"中,并且在wait()所在的代碼行處停止執(zhí)行,直到接到通知或被中斷。
在調(diào)用wait()之前,線程必須獲得該對象級別鎖,即只能在同步方法或者同步代碼塊中調(diào)用wait()方法。
在執(zhí)行wait()方法后,當前線程釋放鎖。在從wait()返回前,線程與其他線程競爭重新獲得鎖。
如果調(diào)用wait()時沒有持有適當?shù)逆i,則拋出IllegalMonitorStateException,它是RuntimeException的一個子類,因此,不需要try-catch語句進行捕捉異常。
方法notify()也要在同步方法或同步塊中調(diào)用,即在調(diào)用前,線程也必須獲得該對象的對象級別。
如果有多個線程等待,則由線程規(guī)劃器隨機挑選出其中一個呈wait狀態(tài)的線程,對其發(fā)出通知notify,并使它等待獲取該對象的對象鎖。
在執(zhí)行notify()方法后,當前線程不會馬上釋放該對象鎖,呈wait狀態(tài)的線程也并不能馬上獲取該對象鎖,要等到執(zhí)行notify()方法的線程將程序執(zhí)行完,也就是退出synchronized代碼塊后,當前線程才釋放鎖,而呈wait狀態(tài)所在的線程才可以獲取該對象鎖。
這也說明notify()方法執(zhí)行后并不立即釋放鎖。
通過調(diào)用wait()方法可以使處于臨界區(qū)的線程進入等待狀態(tài),同時釋放被同步對象的鎖。而notify操作可以喚醒一個因調(diào)用了wait操作而處于阻塞狀態(tài)中的線程,使其進入就緒狀態(tài)。
wait()方法可以使調(diào)用該方法的線程釋放共享資源的鎖,然后從運行狀態(tài)退出,進入等待隊列,直到被再次喚醒。
notify()方法可以隨機喚醒等待隊列中等待統(tǒng)一共享資源的“一個”線程,并使該線程退出等待隊列,進入可運行狀態(tài),也就是notify()方法僅通知“一個”線程。
notifyAll()方法可以使所有正在等待隊列中等待同一個共享資源的“全部”線程從等待狀態(tài)退出,進入可運行狀態(tài)。
每個鎖對象都有兩個隊列,一個是就緒隊列,一個阻塞隊列。就緒隊列存儲了將要獲得鎖的線程,阻塞隊列存儲了被阻塞的線程。一個線程被喚醒后,才會進入就緒隊列,等待CPU的調(diào)度;反之,一個線程被wait后,就會進入阻塞隊列,等待下一次被喚醒。
當方法wait()被執(zhí)行后,鎖被自動釋放,但執(zhí)行完notify()方法,鎖卻不自動釋放。
必須執(zhí)行完notify()方法所在的同步synchronized代碼塊后才釋放鎖。
當線程呈wait()狀態(tài),調(diào)用線程對象的interrupt()方法會出現(xiàn)InterruptedException異常。
執(zhí)行同步代碼塊就會釋放對象的鎖。在執(zhí)行同步代碼塊過程中,遇到異常而導致線程終止,鎖也會被釋放。
在執(zhí)行同步代碼塊的過程中,執(zhí)行了鎖所屬對象的wait()方法,這個線程會釋放對象鎖,而此線程對象會進入線程等待池中,等待被喚醒。
調(diào)用方法notify()一次只隨機通知一個線程進行喚醒。
為了喚醒全部線程,可以使用notifyAll()方法。
帶一個參數(shù)的wait(long)方法的功能是等待某一時間內(nèi)是否有線程對鎖進行喚醒,如果超過這個時間則自動喚醒。
管道流(pipeStream)是一種特殊的流,用于在不同線程間直接傳送數(shù)據(jù)。一個線程發(fā)送數(shù)據(jù)到輸出管道,另一個線程從輸入管道中讀數(shù)據(jù)。通過使用管道,實現(xiàn)不同線程間的通信,而無須借助于類似于臨時文件之類的東西。
方法join()的作用是等待線程對象銷毀。
方法join的作用所屬的線程對象x正常執(zhí)行run()方法中的任務(wù),而使當前線程z進行無限期的阻塞,等待線程x銷毀后再繼續(xù)執(zhí)行線程z后面的代碼。
join與synchronized的區(qū)別是:join在內(nèi)部使用wait()方法進行等待,而synchronized關(guān)鍵字使用的是“對象監(jiān)視器”原理做為同步。
join()與interrupt()方法如果彼此相遇,則會出現(xiàn)異常。
方法join(long)中的參數(shù)是設(shè)定等待的時間。
方法join(long)的功能在內(nèi)部使用wait(long)方法來實現(xiàn)的,所以join(long)方法具有釋放鎖的特點。
當執(zhí)行wait(long)方法后,當前線程的鎖被釋放,那么其他線程就可以調(diào)用此線程中的同步方法了。
Thread.sleep(long)方法卻不釋放鎖。
變量值的共享可以使用public static 變量的形式,所有的線程都使用一個public static變量。
類ThreadLocal主要解決的就是每個線程綁定自己的值,可以將ThreadLocal類比喻成全局存放數(shù)據(jù)的盒子,盒子中可以存儲每個線程的私有數(shù)據(jù)。
類ThreadLocal解決的是變量在不同線程間的隔離性,也就是不同線程擁有自己的值,不同的線程中的值是可以放入ThreadLocal類中進行保存的。在第一次調(diào)用ThreadLocal類的get()方法返回是null,解決辦法是繼承ThreadLocal類重寫initialValue()方法。
使用InheritableThreadLocal可以在子線程中取得父線程繼承下來的值。如果子線程在取得值的同時,主線程將InheritableThreadLocal中的值進行更改,那么子線程取得的值還是舊值。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/68186.html
摘要:我們通過之前幾章的學習已經(jīng)知道在線程間通信用到的關(guān)鍵字關(guān)鍵字以及等待通知機制。今天我們就來講一下線程間通信的其他知識點管道輸入輸出流的使用的使用。將當前線程的此線程局部變量的副本設(shè)置為指定的值刪除此線程局部變量的當前線程的值。 系列文章傳送門: Java多線程學習(一)Java多線程入門 Java多線程學習(二)synchronized關(guān)鍵字(1) java多線程學習(二)synchr...
摘要:所以接下來,我們需要簡單的介紹下多線程中的并發(fā)通信模型。比如中,以及各種鎖機制,均為了解決線程間公共狀態(tài)的串行訪問問題。 并發(fā)的學習門檻較高,相較單純的羅列并發(fā)編程 API 的枯燥被動學習方式,本系列文章試圖用一個簡單的栗子,一步步結(jié)合并發(fā)編程的相關(guān)知識分析舊有實現(xiàn)的不足,再實現(xiàn)邏輯進行分析改進,試圖展示例子背后的并發(fā)工具與實現(xiàn)原理。 本文是本系列的第一篇文章,提出了一個簡單的業(yè)務(wù)場景...
摘要:本文對多線程基礎(chǔ)知識進行梳理,主要包括多線程的基本使用,對象及變量的并發(fā)訪問,線程間通信,的使用,定時器,單例模式,以及線程狀態(tài)與線程組。源碼采用構(gòu)建,多線程這部分源碼位于模塊中。通知可能等待該對象的對象鎖的其他線程。 本文對多線程基礎(chǔ)知識進行梳理,主要包括多線程的基本使用,對象及變量的并發(fā)訪問,線程間通信,lock的使用,定時器,單例模式,以及線程狀態(tài)與線程組。 寫在前面 花了一周時...
并發(fā) 計算機用戶想當然地認為他們的系統(tǒng)一次可以做不止一件事,他們設(shè)想他們可以繼續(xù)在文字處理器中工作,而其他應(yīng)用程序則下載文件、管理打印隊列和流音頻,即使是單個應(yīng)用程序通常也希望一次完成多個任務(wù)。例如,流式音頻應(yīng)用程序必須同時從網(wǎng)絡(luò)上讀取數(shù)字音頻、解壓縮、管理回放并更新其顯示,甚至文字處理器應(yīng)始終準備好響應(yīng)鍵盤和鼠標事件,無論重新格式化文本或更新顯示有多繁忙,可以執(zhí)行此類操作的軟件稱為并發(fā)軟件。 J...
摘要:使用簡記后端掘金全稱為即消息隊列。優(yōu)測優(yōu)社區(qū)干貨精選老司機亂談編輯器之神掘金前言是一種信仰,我自從年有了這個信仰,已經(jīng)個年頭了。 PHP 程序員進階學習書籍參考指南 - 后端 - 掘金PHP程序員進階學習書籍參考指南 @heiyeluren lastmodify: 2016/2/18 ... 當我們在談?wù)撉岸思用軙r,我們在談些什么 - 前端 - 掘金潘建旭,豈安科技(www.bigse...
閱讀 1991·2023-04-26 01:58
閱讀 2073·2019-08-30 11:26
閱讀 2798·2019-08-29 12:51
閱讀 3571·2019-08-29 11:11
閱讀 1239·2019-08-26 11:54
閱讀 2171·2019-08-26 11:48
閱讀 3540·2019-08-26 10:23
閱讀 2463·2019-08-23 18:30