作用對象
對象方法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
...
}
關鍵點
- sleep不釋放鎖,wait釋放鎖
- 線程調用notify的時候,當前線程正持有鎖,因此,其他線程雖被喚醒,但是仍無法獲得鎖。直到該線程退出synchronized這個方法(即執行完),釋放鎖後,其他線程纔有機會去搶奪,去獲得鎖繼續執行。