【问题标题】:What's wrong with wait() and notify() in the following code in Java?Java中以下代码中的wait()和notify()有什么问题?
【发布时间】:2017-05-24 02:09:59
【问题描述】:
void waitForSignal() {
    Object obj = new Object();
    synchronized(Thread.currentThread()) {
        obj.wait();
        obj.notify();
    }

}

我知道它可能会抛出一个InterruptedException,它还有其他问题吗?比如死锁……

【问题讨论】:

  • 它将如何醒来?
  • 它会抛出一个IllegalMonitorStateException,因为你没有在obj上同步。
  • 在当前线程上同步是完全没有意义的。您保护自己免受的唯一线程是您自己的线程。您需要在 object 上进行同步。

标签: java concurrency synchronization


【解决方案1】:
  1. 由于未处理 InterruptedException 而无法编译
  2. 如果处理,会抛出 java.lang.IllegalMonitorStateException,如 cmets 中所述。
  3. 是的,它存在死锁问题。 每次您在此方法中创建一个新对象并等待同一个对象时,它都不会退出等待,因为没有其他线程具有相同的 obj 实例,因此无法通知。

【讨论】:

  • 如果objwaitForSignal()方法之外,并且synchronized(Thread.currentThread())设置为synchronized(obj),是否还会导致死锁,每个线程都会先调用wait()?
  • 是的,它会再次导致死锁。实际上,您的代码在没有等待之前无法正常运行。其他线程只有在拥有 obj 锁时才能调用 notify,这是不可能的,因为调用 obj.wait 的线程已经获得了相同
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多