wait和sleep方法區別
- wait方法位於Object類中,sleep方法位於Thread類中
- 在調用wait方法時,線程必須持有被調用對象的鎖,當調用wait方法後,線程就會釋放掉該對象的鎖(monitor);sleep方法不會釋放對象鎖
- wait方法需要在同步方法或者代碼塊中執行,sleep沒有限制
- wait方法執行後喚醒需要等待其他線程調用對象的notify或者notifyAll方法,sleep執行結束即可喚醒,或者調用interrupt方法兩種情況都可以喚醒
wait、notify和notify
- 當調用wait時,首先需要確保調用了wait方法的線程已經持有了對象的鎖
- 當調用wait後,該線程就會釋放這個對象的鎖,然後進入到等待狀態 (wait set)
- 當線程調用了wait後進入等待狀態時,它就可以等待其他線程調用相同對象的notify和notifyAll方法來使得自己被喚醒
- 一旦這個線程被其他線程喚醒後,該線程就會與其他線程一同開始競爭這個對象的鎖(公平競爭);只有當這個線程獲取了這個對象的鎖後,線程纔會繼續往下執行
- 調用wait方法的代碼片段需要放在一個synchronized塊或者synchronized方法中,這樣纔可以確保線程在調用wait方法前已經獲取到了對象的鎖
- 當調用對象的notify方法時,它會隨機喚醒該對象等待集合(wait set)中的任意一個線程,當某個線程被喚醒後,它就會與其他線程一同競爭對象的鎖
- 當調用對象的notifyAll方法時,它會喚醒該對象等待集合(wait set)中的所有線程,這些線程被喚醒後,又會開始競爭對象的鎖
- 在某一時刻只有唯一一個線程可以擁有對象的鎖