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