在Java中,notifyAll()方法是Object類中的一個方法,用于喚醒所有等待在該對象上的線程。具體實現方式是通過使用內置鎖(即synchronized關鍵字)來實現線程間的通信和同步。
當調用對象的notifyAll()方法時,它會通知所有在該對象上等待的線程,讓它們從等待狀態變為可運行狀態。這樣,所有等待在該對象上的線程都有機會爭奪對象的鎖,進而執行相應的代碼邏輯。
下面是一個簡單的示例代碼,演示了notifyAll()方法的具體實現方式:
public class NotifyAllExample {
private final Object lock = new Object();
public void someMethod() {
synchronized (lock) {
// do something
// 喚醒所有等待在lock對象上的線程
lock.notifyAll();
}
}
public void anotherMethod() {
synchronized (lock) {
try {
// 等待在lock對象上
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
// do something after being notified
}
}
}
在上面的示例中,someMethod()方法通過synchronized關鍵字獲取了lock對象的鎖,并在其中調用了notifyAll()方法來喚醒所有等待在lock對象上的線程。而另一個線程在調用anotherMethod()方法時,會先獲取lock對象的鎖,然后調用wait()方法等待在lock對象上,直到被喚醒后再繼續執行后續邏輯。
需要注意的是,在調用notifyAll()方法之前,必須先獲取對象的鎖,否則會拋出IllegalMonitorStateException異常。同時,notifyAll()方法只會喚醒等待在該對象上的線程,而不會釋放鎖,因此被喚醒的線程需要重新爭取鎖才能執行。