sleep和wait的區(qū)別

一、sleep是Thread的方法,wait是Object的方法

二、sleep不釋放鎖,wait會釋放

? ? ? ? 線程調(diào)用sleep方法后,當前線程會進行睡眠,且線程進入阻塞狀態(tài),但不會釋放已持有的鎖(如果有的話,如果沒有鎖也可以執(zhí)行sleep方法)。即線程只會讓出cpu執(zhí)行時間片,不會釋放同步資源鎖。

? ? ? ? 線程執(zhí)行wait方法后,當前線程會進入阻塞等待狀態(tài),讓出cpu執(zhí)行時間片的同時釋放同步資源鎖(一定有鎖,因為wait方法必須和synchronized或Lock一起使用,即第三點)

三、sleep不依賴同步方法,wait依賴

執(zhí)行wait()報錯
報錯信息

可見wait方法必須在同步代碼區(qū)中執(zhí)行(synchronized或lock)。而sleep方法不需要。

四、sleep不需要被喚醒,wait需要。

sleep比較簡單,我們著重看一下wait,我們可以去查看到源碼中的一段注釋。

jdk源碼中wait方法的注釋

翻譯一下就是:

導致當前線程等待,直到另一個線程為此對象調(diào)用notify()方法或notifyAll()方法。 換句話說,此方法的行為就像它簡單地執(zhí)行調(diào)用wait(0)一樣。

當前線程必須擁有該對象的監(jiān)視器。線程釋放對此監(jiān)視器的所有權,并等待直到另一個線程通過調(diào)用notify方法或notifyAll方法通知等待在該對象的監(jiān)視器上喚醒的線程。然后線程等待,直到可以重新獲得監(jiān)視器的所有權并恢復執(zhí)行。

與在一個參數(shù)版本中一樣,可能發(fā)生中斷和虛假喚醒,并且該方法應始終在循環(huán)中使用:...此方法只能由作為此對象的監(jiān)視器的所有者的線程調(diào)用。有關線程可以成為監(jiān)視器所有者的方式的說明,請參見{@code notify}方法。

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容