Java多線程wait()和notify()

方法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()方法?;蛘甙袰線程的notify()改成notifyAll()喚醒當前對象鎖的所有wait()線程。

這里寫圖片描述
這里寫圖片描述

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

這里寫圖片描述
這里寫圖片描述

來源:CSDN博客

上一篇: 十分鐘理解 Java 中的動態代理

下一篇: 性能分析系列-小命令保證大性能

分享到: 更多
pk10精准前三计划 摇骰子斋和飞的规矩 重时时彩五星综合走势图直播 pk10赛车直播官网平台 长期跟六肖赚钱吗 双色球截止投注时间是几点 重庆时时采彩开奖记录 pk10最牛七码单期计划 时时彩五星独胆攻略 psv上古卷轴携带版 内蒙古时时五码走势图 单场上下单双玩法 时时彩后一稳赚不赔法 pk10计划下载 极速赛车购买技巧 雷速体育比分直播