【发布时间】:2013-04-07 16:27:45
【问题描述】:
我希望快速提问。如果我在 Java 中的一个对象中调用 notify,是否保证在我调用 notify 后不会唤醒任何等待(严格)的线程。或者换句话说,只通知唤醒已经在等待的线程。据推测,notifyAll 的行为方式相同。
例如,如果保证不成立,则可以按以下顺序:
- 线程N获取锁,调用notify,释放锁。
- 线程W获取锁,调用wait并释放锁。
- 线程 W 被线程 N 的通知唤醒并继续...
感谢您的帮助!
【问题讨论】:
我希望快速提问。如果我在 Java 中的一个对象中调用 notify,是否保证在我调用 notify 后不会唤醒任何等待(严格)的线程。或者换句话说,只通知唤醒已经在等待的线程。据推测,notifyAll 的行为方式相同。
例如,如果保证不成立,则可以按以下顺序:
感谢您的帮助!
【问题讨论】:
当您调用 notify 时,正在等待的线程之一(如果有)将被唤醒。当前未等待此对象的线程无法唤醒,尚未等待(但稍后会等待)的线程也无法唤醒(显然)。
如果您调用 notifyAll 那么您将唤醒当前等待的所有线程。
我建议您阅读有关命中here
【讨论】:
好吧,notify() 方法的 javadocs 明确指出:
唤醒正在在此对象的监视器上等待的单个线程。
notifyAll() 也一样:
唤醒所有正在在此对象的监视器上等待的线程。
为了被放入等待线程队列中,线程必须首先获得对象的锁,然后释放它,只有这样其他线程才能获得锁并调用notify()。
所以我想你不必担心。
【讨论】: