【问题标题】:java.lang.Object notify() - does it notify a thread at random, or the first one to call wait()?java.lang.Object notify() - 它是随机通知一个线程,还是第一个调用wait()?
【发布时间】:2013-08-05 09:53:47
【问题描述】:

假设我有 3 个线程(A、B 和 C)正在等待对象 O 上的监视器。线程 D 当前拥有对象 O 的监视器。当线程 D 调用 O.notify 时,哪个线程首先得到通知? A、B 还是 C?它是否基于这些线程中的第一个在对象 O 上调用 wait() ?也许我在谈论 notify() 和 notifyAll() 之间的区别?如果我猜的话,notify() 会通知第一个线程调用 wait(), notifyAll() 会通知所有调用 wait() 的线程,而下一个获取监视器的线程基本上是随机的?

【问题讨论】:

    标签: concurrency wait notify


    【解决方案1】:

    这是在监视器上等待的任何线程。来自section 17.2.2 of the JLS

    无法保证选择等待集中的哪个线程。这种从等待集中的移除使你能够在等待动作中恢复。但是请注意,在 t 完全解锁 m 的监视器之后的某个时间,恢复时 u 的锁定操作不会成功。

    来自Object.notify docs

    唤醒在此对象的监视器上等待的单个线程。如果有任何线程正在等待该对象,则选择其中一个被唤醒。该选择是任意的,并由实施自行决定。线程通过调用wait 方法之一在对象的监视器上等待。

    【讨论】:

      猜你喜欢
      • 2012-08-18
      • 2011-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-18
      • 2021-05-16
      • 1970-01-01
      相关资源
      最近更新 更多