wait和notify必须在同步代码块中调用吗
时间: 2024-04-09 18:29:16 浏览: 75
是的,`wait()`和`notify()`方法必须在同步代码块或同步方法中调用。这是因为在调用这两个方法时,必须持有对象的监视器(即锁),以确保线程安全性。
在Java中,每个对象都有一个内置的监视器(也称为锁),可以通过`synchronized`关键字来获取。只有持有了对象的监视器,才能调用该对象的`wait()`和`notify()`方法。
下面是一个示例,展示了如何在同步代码块中使用`wait()`和`notify()`方法:
```java
class MyTask {
public synchronized void performTask() {
while (!condition) {
try {
// 进入等待状态,并释放锁
wait();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
// 执行任务逻辑
}
public synchronized void notifyTask() {
// 修改条件
condition = true;
// 唤醒等待的线程
notify();
}
}
```
在上面的示例中,`performTask()`方法通过`synchronized`关键字获取了对象的监视器,并在循环中调用了`wait()`方法来等待条件满足。`notifyTask()`方法也使用`synchronized`关键字获取了相同的监视器,并在修改条件之后调用`notify()`方法来唤醒等待的线程。
请注意,`wait()`和`notify()`方法只能在已经获取了对象的监视器的情况下调用,否则会抛出`IllegalMonitorStateException`。因此,它们必须在同步代码块或同步方法中使用,以确保在调用这些方法时持有正确的锁。
阅读全文