wait、notify、notifyAll

本文總結下wait、notify、notifyAll,其實是爲了試試markdown。。。

wait

  • 釋放所持有的鎖,線程阻塞。

  • 能釋放,那必須先持有,和synchronized配合使用。

  • 線程調用wait方法,會進入鎖對象的等待池,等待被喚醒。

  • 由於線程進入等待,需要捕獲InterruptedException,防止被打斷,無法繼續進行。

notify

  • 線程釋放,喚醒鎖對象等待池中的一個線程,操作系統決定具體喚醒哪個線程。

  • 能釋放鎖,必然先持有鎖,wait、notify、synchronized配套出現。

  • 釋放當前鎖,但是不是立馬釋放,而是把notify後的代碼執行完,直到同步塊結束。

notifyAll

  • 基本同notify,區別就是notify指喚醒一個線程,notifyAll喚醒所有鎖對象的等待線程,競爭鎖。

注意點

  • 必須一個線程wait後,另一個線程調用notify/notifyAll才能喚醒前一個線程。如果順序錯了,則無法喚醒

  • 當同步塊中有判斷條件時,需要使用while,而不能使用if。因爲線程喚醒後,原來滿足的條件此時可能已經不滿足了,需要再次判斷。

  • noitfy/notifyAll調用後,線程不會立即釋放鎖,會將同步塊的代碼執行完才釋放。

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