0

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

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

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

谢谢你的帮助!

4

2 回答 2

0

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

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

我建议您在这里阅读有关命中的信息

于 2013-04-07T16:38:25.667 回答
0

好吧,notify()方法的javadocs清楚地指出它:

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

同样的事情notifyAll()

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

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

所以我想你不必担心。

于 2013-04-07T16:38:26.693 回答