notify()
和
notifyAll()
都是
Object
对象用于通知处在等待该对象的线程的方法。
void notify():
唤醒一个正在等待该对象的线程。
void notifyAll():
唤醒所有正在等待该对象的线程。
notify
可能会导致死锁,而
notifyAll
则不会
任何时候只有一个线程可以获得锁,也就是说只有一个线程可以运行
synchronized
中的代码
使用
notifyall,
可以唤醒 所有处于
wait
状态的线程,使其重新进入锁的争夺队列中,而
notify
只能唤醒一
个。
wait()
应配合
while
循环使用,不应使用
if
,务必在
wait()
调用前后都检查条件,如果不满足,必须调用
notify()
唤醒另外的线程来处理,自己继续
wait()
直至条件满足再往下执行。
notify()
是对
notifyAll()
的一个优化,但它有很精确的应用场景,并且要求正确使用。不然可能导致死
锁。正确的场景应该是
WaitSet
中等待的是相同的条件,唤醒任一个都能正确处理接下来的事项,如果
唤醒的线程无法正确处理,务必确保继续
notify()
下一个线程,并且自身需要重新回到
WaitSet
中
.