在Java語言中,wait()和notifyAll()方法是用于線程間通信的重要功能之一。wait()方法會使當前線程進入等待狀態(tài),并且會釋放它所持有的對象鎖,直到其他線程調用notifyAll()或notify()方法喚醒它。notifyAll()方法則會喚醒正在等待該對象鎖的所有線程,從而讓它們重新競爭對象鎖。
public synchronized void add() { while (count >= MAX_SIZE) { try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } count++; System.out.println(Thread.currentThread().getName() + " add: " + count); notifyAll(); }
上面的代碼演示了如何在生產(chǎn)者消費者模型中使用wait()和notifyAll()方法實現(xiàn)線程同步。在該代碼中,add()方法是一個同步方法,當隊列已滿時,線程會進入等待狀態(tài),直到其他線程調用notifyAll()方法通知它可以繼續(xù)執(zhí)行。當生產(chǎn)者成功添加一個元素時,會先調用notifyAll()方法喚醒其他線程,然后再釋放對象鎖。
需要注意的是,wait()和notifyAll()方法必須在同步塊內(nèi)部調用,并且在調用wait()方法之前應該先檢查共享變量的狀態(tài),否則可能會出現(xiàn)虛假喚醒的情況,導致程序邏輯出錯。
public synchronized void remove() { while (count<= 0) { try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } count--; System.out.println(Thread.currentThread().getName() + " remove: " + count); notifyAll(); }
以上代碼展示了消費者如何使用wait()和notifyAll()方法實現(xiàn)線程同步。在remove()方法中,當隊列為空時,線程會進入等待狀態(tài)。當消費者成功取走一個元素時,會先調用notifyAll()方法喚醒其他線程,然后再釋放對象鎖。
在Java多線程編程中,wait()和notifyAll()方法是非常重要的工具,它們可以幫助我們實現(xiàn)線程之間的通信和同步,從而讓程序正確地運行。但是需要注意的是,它們的使用需要非常謹慎,否則可能會導致程序出現(xiàn)死鎖等問題。