Java多線程wait()和notify()

學習Java的同學注意了!!!
學習過程中遇到什麼問題或者想獲取學習資源的話,歡迎加入Java學習交流羣,羣號碼:286945438 我們一起學Java!

方法wait()的作用是使當前執行代碼的線程進行等待,wait()方法是Object類的方法,該方法用來將當前線程置入“預執行隊列”中,並且在wait()所在的代碼行處停止執行,直到接到通知或被中斷位置。在調用wait()之前,線程必須獲得該對象的對象級別鎖,即只能在同步方法或同步塊中調用wait()方法。在執行wait()方法後,當前線程釋放鎖。在從wait()返回前,線程與其它線程競爭重新獲得鎖。如果調用wait()時沒有持有適當的鎖,則拋出IllegalMonitorStateException。

方法notify()也要在同步方法或同步塊中調用,即在調用前,線程也必須獲得該對象的對象級別鎖。如果調用notify()時沒有持有適當的鎖,也會拋出IllegalMonitorStateException。該方法用來通知那些可能等待該對象的對象鎖的其它線程,如果有多個線程等待,則由線程規劃器隨機挑選出其中一個是wait狀態的線程,對其發出通知notify,並使它等待獲取該對象的對象鎖。需要說明的是,在執行notify()方法之後,當前線程不會馬上釋放該對象鎖,是wait狀態的線程也並不能馬上獲取該對象鎖,要等到執行notify()方法的線程將程序執行完,也就是退出同步代碼塊後,當前線程纔會釋放鎖,而wait狀態所在的線程纔可以獲取該對象鎖。當第一個獲得該對象鎖的wait線程運行完畢之後,它會釋放掉該對象鎖,此時如果該對象沒有再次使用notify語句,則即便該對象已經空閒,其它wait狀態等待的線程由於沒有得到該對象的通知,還會繼續阻塞在wait狀態,直到這個對象發出一個notify或notifyAll。

圖片描述

圖片描述

這個時候有線程A和B都在wait狀態,但是線程C只通知了一個wait線程繼續執行。所以有一個線程阻塞在wait狀態。所以我還需要在線程A和B在wait結束之後調用notify()方法。或者把C線程的notify()改成notifyAll()喚醒當前對象鎖的所有wait()線程。

圖片描述

圖片描述

強調:在執行notify()方法之後,當前線程不會馬上釋放該對象鎖,是wait狀態的線程也並不能馬上獲取該對象鎖,要等到執行notify()方法的線程將程序執行完,也就是退出同步代碼塊後,當前線程纔會釋放鎖,而wait狀態所在的線程纔可以獲取該對象鎖

圖片描述

圖片描述

學習Java的同學注意了!!!
學習過程中遇到什麼問題或者想獲取學習資源的話,歡迎加入Java學習交流羣,羣號碼:286945438 我們一起學Java!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章