简述为什么 wait 和 notify 方法要在同步块中调用?
参考答案:
wait()
和 notify()
是 Java 中用于线程间通信的两个重要方法,它们都是 java.lang.Object
类的方法,因此所有的 Java 对象都可以调用这两个方法。这两个方法通常与 synchronized
关键字一起使用,以确保线程安全。
wait()
方法使当前线程等待,直到其他线程调用同一个对象的 notify()
或 notifyAll()
方法。notify()
方法唤醒在此对象监视器上等待的单个线程,而 notifyAll()
方法唤醒所有在此对象监视器上等待的线程。
为什么 wait()
和 notify()
方法要在同步块或同步方法中调用,主要出于以下两个原因:
- 线程安全性:
wait()
、notify()
和notifyAll()
方法必须在一个对象的同步块或同步方法中调用,这是因为这些方法需要获取对象的内部锁。如果不在同步块或同步方法中调用这些方法,可能会导致线程安全问题,例如出现竞态条件。 - 避免死锁:在 Java 中,
wait()
方法会自动释放对象的内部锁,使得其他线程可以进入同步块或同步方法。如果wait()
方法不在同步块或同步方法中调用,那么对象的内部锁可能不会被正确释放,从而导致死锁。
因此,为了确保线程安全和避免死锁,我们通常会在同步块或同步方法中调用 wait()
、notify()
和 notifyAll()
方法。