是的,wait()
方法可以用于同步。在 Java 中,wait()
是 Object
類的一個(gè)方法,它用于讓當(dāng)前線程等待,直到其他線程調(diào)用同一個(gè)對(duì)象的 notify()
或 notifyAll()
方法。wait()
方法通常與 synchronized
關(guān)鍵字一起使用,以確保線程安全。
當(dāng)一個(gè)線程調(diào)用某個(gè)對(duì)象的 wait()
方法時(shí),它會(huì)釋放該對(duì)象的鎖,進(jìn)入等待狀態(tài)。其他線程必須先獲得該對(duì)象的鎖(通過(guò) synchronized
關(guān)鍵字),然后才能調(diào)用 notify()
或 notifyAll()
方法喚醒等待的線程。一旦被喚醒,等待的線程將重新嘗試獲取對(duì)象的鎖,如果成功,它將退出 wait()
方法并繼續(xù)執(zhí)行。
這是一個(gè)簡(jiǎn)單的示例:
public class SynchronizedWaitExample {
private final Object lock = new Object();
private boolean ready = false;
public void waitForSignal() throws InterruptedException {
synchronized (lock) {
while (!ready) {
lock.wait();
}
System.out.println("Signal received!");
}
}
public void sendSignal() {
synchronized (lock) {
ready = true;
lock.notify();
}
}
public static void main(String[] args) throws InterruptedException {
SynchronizedWaitExample example = new SynchronizedWaitExample();
Thread t1 = new Thread(() -> {
try {
example.waitForSignal();
} catch (InterruptedException e) {
e.printStackTrace();
}
});
Thread t2 = new Thread(() -> {
try {
Thread.sleep(2000); // 等待 2 秒
example.sendSignal();
} catch (InterruptedException e) {
e.printStackTrace();
}
});
t1.start();
t2.start();
}
}
在這個(gè)示例中,waitForSignal()
方法使用 synchronized
關(guān)鍵字確保在同一時(shí)間只有一個(gè)線程可以訪問(wèn)共享資源(lock
對(duì)象)。當(dāng)一個(gè)線程調(diào)用 wait()
方法時(shí),它會(huì)釋放鎖并進(jìn)入等待狀態(tài)。另一個(gè)線程在獲得鎖后調(diào)用 notify()
方法喚醒等待的線程。