《effective java》这本书的原话:
notify()方法唤醒的是单个正在等待的线程,而notifyAll方法唤醒的是所有正在等待的线程,一种常见的说法就是,应该始终使用notifyAll()
方法,这是合理而保守的建议,它总是会产生正确的结果,因为他可以保证你将会唤醒所有需要被唤醒的线程,可以也会唤醒一些其他线程,但这不会影响程序的正确性,这些程序醒来之后,会检查他们正在等待的条件(这就和while和wait对应上了),如果发现条件并不满足,就会继续等待。
用notifyAll方法代替notify方法可以避免来自不相关线程的以外或者恶意等待(反正都会直接激活),否则,这样的的等待会“吞掉”一个关键的通知,使真正的接受线程无限地等待下去
总结来说,就是永远都要用notifyAll(),而不是notify