跳到主要内容

简述为什么 wait 和 notify 方法要在同步块中调用?

参考答案:

wait()notify() 是 Java 中用于线程间通信的两个重要方法,它们都是 java.lang.Object 类的方法,因此所有的 Java 对象都可以调用这两个方法。这两个方法通常与 synchronized 关键字一起使用,以确保线程安全。

wait() 方法使当前线程等待,直到其他线程调用同一个对象的 notify()notifyAll() 方法。notify() 方法唤醒在此对象监视器上等待的单个线程,而 notifyAll() 方法唤醒所有在此对象监视器上等待的线程。

为什么 wait()notify() 方法要在同步块或同步方法中调用,主要出于以下两个原因:

  1. 线程安全性wait()notify()notifyAll() 方法必须在一个对象的同步块或同步方法中调用,这是因为这些方法需要获取对象的内部锁。如果不在同步块或同步方法中调用这些方法,可能会导致线程安全问题,例如出现竞态条件。
  2. 避免死锁:在 Java 中,wait() 方法会自动释放对象的内部锁,使得其他线程可以进入同步块或同步方法。如果 wait() 方法不在同步块或同步方法中调用,那么对象的内部锁可能不会被正确释放,从而导致死锁。

因此,为了确保线程安全和避免死锁,我们通常会在同步块或同步方法中调用 wait()notify()notifyAll() 方法。