【问题标题】:Order of waits and notify等待和通知的顺序
【发布时间】:2013-04-07 16:27:45
【问题描述】:

我希望快速提问。如果我在 Java 中的一个对象中调用 notify,是否保证在我调用 notify 后不会唤醒任何等待(严格)的线程。或者换句话说,只通知唤醒已经在等待的线程。据推测,notifyAll 的行为方式相同。

例如,如果保证不成立,则可以按以下顺序:

  1. 线程N获取锁,调用notify,释放锁。
  2. 线程W获取锁,调用wait并释放锁。
  3. 线程 W 被线程 N 的通知唤醒并继续...

感谢您的帮助!

【问题讨论】:

    标签: java wait notify


    【解决方案1】:

    当您调用 notify 时,正在等待的线程之一(如果有)将被唤醒。当前未等待此对象的线程无法唤醒,尚未等待(但稍后会等待)的线程也无法唤醒(显然)。

    如果您调用 notifyAll 那么您将唤醒当前等待的所有线程。

    我建议您阅读有关命中here

    【讨论】:

      【解决方案2】:

      好吧,notify() 方法的 javadocs 明确指出:

      唤醒正在在此对象的监视器上等待的单个线程。

      notifyAll() 也一样:

      唤醒所有正在在此对象的监视器上等待的线程。

      为了被放入等待线程队列中,线程必须首先获得对象的锁,然后释放它,只有这样其他线程才能获得锁并调用notify()

      所以我想你不必担心。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-16
        • 1970-01-01
        相关资源
        最近更新 更多