java notify和notifyAll的區別

notify和notifyAll的最主要的區別

  • notify只是喚醒一個正在wait當前對象鎖的線程,而notifyAll喚醒所有。值得注意的是:notify是本地方法,具體喚醒哪一個線程由虛擬機控制;如果有多個線程等待,則線程規劃器任意挑選出其中一個wait()狀態的線程來發出通知

    • 調用notify和notifyAll方法後,當前線程並不會立即放棄鎖的持有權,而必須要等待當前同步代碼塊執行完纔會讓出鎖

    • 當有線程調用了對象的notifyAll()方法(喚醒所有wait線程)或 notify()方法(只隨機喚醒一個 wait 線程),被喚醒的的線程便會進入該對象的鎖池中,鎖池中的線程會去競爭該對象鎖。也就是說,調用了notify後只有一個線程會由等待池進入鎖池,而notifyAll會將該對象等待池內的所有線程移動到鎖池中,等待鎖競爭

    • 優先級高的線程競爭到對象鎖的概率大,假若某線程沒有競爭到該對象鎖,它還會留在鎖池中,唯有線程再次調用wait()方法,它纔會重新回到等待池中。而競爭到對象鎖的線程則繼續往下執行,直到執行完了synchronized代碼塊,它會釋放掉該對象鎖,這時鎖池中的線程會繼續競爭該對象鎖。

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