wait是在當前線程持有wait對象鎖的情況下,暫時放棄鎖,並讓出CPU資源,並積極等待其它線程調用同一對象的notify或者notifyAll方法。注意,即使只有一個線程在等待,並且有其它線程調用了notify或者notifyAll方法,等待的線程只是被激活,但是它必須得再次獲得鎖才能繼續往下執行。換言之,即使notify被調用,但只要鎖沒有被釋放,原等待線程因為未獲得鎖仍然無法繼續執行。
wait方法需要釋放鎖,前提條件是它已經持有鎖。所以wait和notify(或者notifyAll)方法都必須被包裹在synchronized語句塊中,並且synchronized后鎖的對象應該與調用wait方法的對象一樣。否則拋出IllegalMonitorStateException
sleep方法告訴操作系統至少指定時間內不需為線程調度器為該線程分配執行時間片,並不釋放鎖(如果當前已經持有鎖)。實際上,調用sleep方法時並不要求持有任何鎖。