wait、sleep、notify、notifyAll方法總結

wait和sleep方法區別

  1. wait方法位於Object類中,sleep方法位於Thread類中
  2. 在調用wait方法時,線程必須持有被調用對象的鎖,當調用wait方法後,線程就會釋放掉該對象的鎖(monitor);sleep方法不會釋放對象鎖
  3. wait方法需要在同步方法或者代碼塊中執行,sleep沒有限制
  4. wait方法執行後喚醒需要等待其他線程調用對象的notify或者notifyAll方法,sleep執行結束即可喚醒,或者調用interrupt方法兩種情況都可以喚醒

wait、notify和notify

  1. 當調用wait時,首先需要確保調用了wait方法的線程已經持有了對象的鎖
  2. 當調用wait後,該線程就會釋放這個對象的鎖,然後進入到等待狀態 (wait set)
  3. 當線程調用了wait後進入等待狀態時,它就可以等待其他線程調用相同對象的notify和notifyAll方法來使得自己被喚醒
  4. 一旦這個線程被其他線程喚醒後,該線程就會與其他線程一同開始競爭這個對象的鎖(公平競爭);只有當這個線程獲取了這個對象的鎖後,線程纔會繼續往下執行
  5. 調用wait方法的代碼片段需要放在一個synchronized塊或者synchronized方法中,這樣纔可以確保線程在調用wait方法前已經獲取到了對象的鎖
  6. 當調用對象的notify方法時,它會隨機喚醒該對象等待集合(wait set)中的任意一個線程,當某個線程被喚醒後,它就會與其他線程一同競爭對象的鎖
  7. 當調用對象的notifyAll方法時,它會喚醒該對象等待集合(wait set)中的所有線程,這些線程被喚醒後,又會開始競爭對象的鎖
  8. 在某一時刻只有唯一一個線程可以擁有對象的鎖

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章