java notify是什么,讓我們一起了解一下?
notify是喚醒一個處于等待狀態的線程,調用notify時,只有一個等待線程會被喚醒而且它不能保證哪個線程會被喚醒,這取決于線程調度器。notify()方法的基本思想是給方法或代碼塊提供一種相互通信的方式,或者代碼塊同步于某個特定對象。
Java中notify和notifyAll的區別是什么?
Java提供了兩個方法notify和notifyAll來喚醒在某些條件下等待的線程,你可以使用它們中的任何一個,但是Java中的notify和notifyAll之間存在細微差別,這使得它成為Java中流行的多線程面試問題之一。
當你調用notify時,只有一個等待線程會被喚醒而且它不能保證哪個線程會被喚醒,這取決于線程調度器。雖然如果你調用notifyAll方法,那么等待該鎖的所有線程都會被喚醒,但是在執行剩余的代碼之前,所有被喚醒的線程都將爭奪鎖定,這就是為什么在循環上調用wait,因為如果多個線程被喚醒,那么線程是將獲得鎖定將首先執行,它可能會重置等待條件,這將迫使后續線程等待。
因此,notify和notifyAll之間的關鍵區別在于notify()只會喚醒一個線程,而notifyAll方法將喚醒所有線程。
何時在Java中使用notify和notifyAll?
1、如果所有線程都在等待相同的條件,并且一次只有一個線程可以從條件變為true,則可以使用notify over notifyAll。
2、在這種情況下,notify是優于notifyAll 因為喚醒所有這些因為我們知道只有一個線程會受益而所有其他線程將再次等待,所以調用notifyAll方法只是浪費CPU。
3、雖然這看起來很合理,但仍有一個警告,即無意中的接收者吞下了關鍵通知。通過使用notifyAll,我們確保所有收件人都會收到通知。
實戰案例說明如下:
class?NumberPrint?implements?Runnable{ private?int?number; public?byte?res[]; public?static?int?count?=?5; public?NumberPrint(int?number,?byte?a[]){ this.number?=?number; res?=?a; } public?void?run(){ synchronized?(res){ while(count--?>?0){ try?{ res.notify();//喚醒等待res資源的線程,把鎖交給線程(該同步鎖執行完畢自動釋放鎖) System.out.println("?"+number); res.wait();//釋放CPU控制權,釋放res的鎖,本線程阻塞,等待被喚醒。 System.out.println("------線程"+Thread.currentThread().getName()+"獲得鎖,wait()后的代碼繼續運行:"+number); }?catch?(InterruptedException?e)?{ //?TODO?Auto-generated?catch?block e.printStackTrace(); } }//end?of?while return; }//synchronized } } public?class?WaitNotify?{ public?static?void?main(String?args[]){ final?byte?a[]?=?{0};//以該對象為共享資源 new?Thread(new?NumberPrint((1),a),"1").start(); new?Thread(new?NumberPrint((2),a),"2").start(); } }
以上就是小編今天的分享了,希望可以幫助到大家。