Java 中 wait 方法使用注意事项:必须配合 synchronized
在 Java 中,wait 方法必须配合 synchronized 代码块一起使用,否则在运行时就会抛出 IllegalMonitorStateException 异常。这是因为 wait 方法需要在获取对象的锁之后才能调用,否则会抛出该异常。
wait 方法是 Object 类中的一个方法,它用于使当前线程进入等待状态,并释放对象的锁。当其他线程调用 notify 或 notifyAll 方法时,等待的线程会被唤醒。
synchronized 代码块用于保证代码块在同一时间只能被一个线程访问。在 synchronized 代码块中,线程会获取对象的锁,并在代码块执行完毕后释放锁。
如果在没有获取对象的锁的情况下调用 wait 方法,就会抛出 IllegalMonitorStateException 异常。这是因为 wait 方法需要在拥有对象锁的情况下才能被调用,才能保证线程在等待状态时不会被其他线程干扰。
以下是一个示例代码,演示了 wait 方法的使用:
public class WaitExample {
private Object lock = new Object();
public void producer() {
synchronized (lock) {
try {
System.out.println("Producer is waiting");
lock.wait();
System.out.println("Producer is notified");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public void consumer() {
synchronized (lock) {
System.out.println("Consumer is notifying");
lock.notify();
}
}
}
在上面的代码中,producer 方法和 consumer 方法都使用了 synchronized 代码块来获取对象的锁。producer 方法调用 wait 方法进入等待状态,consumer 方法调用 notify 方法唤醒等待的 producer 方法。
总结:
wait方法必须在获取对象的锁之后才能调用。- 使用
synchronized代码块来获取对象的锁。 wait方法用于使线程进入等待状态,notify方法用于唤醒等待的线程。notify方法只能唤醒一个等待的线程,notifyAll方法可以唤醒所有等待的线程。
原文地址: https://www.cveoy.top/t/topic/qeo4 著作权归作者所有。请勿转载和采集!