notify()和notifyAll()的区别
-
notify()方法只会通知等待队列中的第一个相关线程
-
notifyAll()通知所有等待该竞争资源的线程
在经典生产者-消费者模型中,如果使用notify(),且配置多个消费者,可能会导致多个消费者循环调用,导致死锁;而使用notifyAll(),可以自加上状态控制wait(),唤醒所有线程,然后消费者会因为不符合状态控制而放弃权限,最终生产者抢占资源唤醒。
所以,当多个(两个以上的)线程操作同一个对象的时候最好使用的notifyAll(),这样就不会出现上述的问题了。