背景:這篇博客用來總結java鎖相關的知識點,平時還是要自己多加練習
wait 和 notify以及notifyAll
(1)、方法介紹
1.wait、notify以及notifyAll都是Object對象的方法,他們必須在被 synchronized 同步的方法或代碼塊中調用,否則會報錯。
2. 調用wait方法會使該線程進入等待狀態,並且會釋放被同步對象的鎖。
3. notify操作可以喚醒一個因執行wait而處於阻塞狀態的線程,使其進入就緒狀態,被喚醒的線程會去嘗試着獲取對象鎖,然后執行wait之后的代碼。如果發出notify操作時,沒有線程處於阻塞狀態,那么該命令會忽略。注意執行notify並不會馬上釋放對象鎖,會等到執行完該同步方法或同步代碼塊后才釋放,下面會有例子來證明。
notify方法可以隨機喚醒等待隊列中等待同一共享資源的“一個”線程,使其退出等待隊列進入可運行狀態。
4. notifyAll方法可以喚醒等待隊列中等待同一共享資源的“全部”線程從等待狀態退出,進入可運行狀態。此時,優先級最高的那個線程優先執行,但也有可能是隨機執行,這取決於JVM虛擬機的實現。
最后說下 wait和sleep的區別,這也是面試經常面到的問題。
1.sleep是Thread類的方法而wait是Object類的方法。
2.sleep不會立馬釋放對象鎖,而wait會釋放。
java 多線程之wait、notify詳解(講的不錯)