【Java】弄清wait,notify,notifyAll,sleep的區別

作用對象

對象方法wait,notify,notifyAll
線程方法sleep

使用方法

synchronized(obj){
	Thread.sleep(1000);//只是使這塊延長時間結束,不釋放鎖,間接使鎖延長
...
}
synchronized(obj){
	obj.wait(10);//立即釋放鎖,時間到後自動甦醒或被notifty喚醒,喚醒後待重新拿到鎖時再執行後續代碼
...
}
synchronized(obj){
	obj.notify();//喚醒wait的線程,告訴它鎖即將被釋放,繼續執行後續代碼,執行完釋放鎖
...
}
synchronized(obj){
	obj.notifyAll();//喚醒所有wait的線程,具體效果參考notify
...
}

關鍵點

  1. sleep不釋放鎖,wait釋放鎖
  2. 線程調用notify的時候,當前線程正持有鎖,因此,其他線程雖被喚醒,但是仍無法獲得鎖。直到該線程退出synchronized這個方法(即執行完),釋放鎖後,其他線程纔有機會去搶奪,去獲得鎖繼續執行。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章