Java中的notify和notifyAll方法是用於多線程編程中的線程間通信機制。在多線程編程中,多個線程可能需要對共享的資源進行訪問,為了保證多個線程之間的協作和同步,Java提供了很多機制,其中wait、notify和notifyAll方法就是其中的一種。
一、notify和notifyAll方法的作用與區別
notify和notifyAll方法都是用於在同步代碼塊中喚醒等待線程的方法,它們的作用都是喚醒在調用對象上等待的線程。具體來講,當有其他線程調用了該對象的notify()或notifyAll()方法時,處於該對象等待池中的線程就可以被喚醒,從而繼續執行。
notify方法的作用是隨機選取等待在該對象上的某一個線程進行喚醒,而notifyAll方法則是喚醒該對象所有等待池中的線程,並讓它們進入鎖競爭池,爭奪執行權。簡單來說,notify方法是喚醒單個線程,notifyAll方法是喚醒所有等待線程。
二、notify和notifyAll方法的使用場景
由於notify方法只能喚醒某一個等待線程,無法來實現群體喚醒,因此在某些情況下,使用notify方法可能會造成線程飢餓,即有些線程一直得不到執行。
而notifyAll方法則沒有這個問題,它能夠喚醒所有等待線程,使得它們都有機會來競爭執行權,從而避免了線程飢餓的問題。因此,當共享資源被多個線程所使用,並且線程間的協作非常重要時,通常使用notifyAll方法。
三、notify和notifyAll方法的示例代碼
下面是notify和notifyAll方法的示例代碼,分別使用兩者來實現線程同步和協作。
class SharedObject{ private boolean flag = false; public synchronized void doWait(){ while(!flag){ try{ wait(); }catch(InterruptedException e){ e.printStackTrace(); } } flag = false; notify(); } public synchronized void doNotify(){ while(flag){ try{ wait(); }catch(InterruptedException e){ e.printStackTrace(); } } flag = true; notify(); } }
在上面的代碼中,flag用於標記是否有資源可用,如果flag為true,則表示資源可用,若為false,則表示資源不可用。doWait()方法在等待資源變為可用,當flag為false時,調用wait()方法進行等待,直到doNotify()方法喚醒該線程。當資源可用時,flag會被設置為false,並通過notify()方法通知其他線程進行競爭。doNotify()方法則是在資源可用時,將flag設置為true,並調用notify()方法喚醒其他線程進行競爭。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/234117.html