当前位置: 移动技术网 > IT编程>开发语言>Java > java notify和notifyAll的对比

java notify和notifyAll的对比

2019年07月22日  | 移动技术网IT编程  | 我要评论

残疾人征婚吧,山东二胎政策放宽2014,苏秋妍

 java notify和notifyall

首先从名字可以了解,notify是通知一个线程获取锁,notifyall是通知所有相关的线程去竞争锁。

notify不能保证获得锁的线程,真正需要锁,并且可能产生死锁

举例1:

所有人(消费者线程)准备吃饭,食堂没有开放(没有释放锁)打饭窗口(锁),所有人等待(waiting)。

食堂开饭打饭窗口(释放锁),并广播消息“开饭了”(notifyall),所有人竞争排队,并等待吃饭(blocked)。每一个人依次在打饭窗口(获得锁)打饭(runnable)。如果想吃饭就打完饭后离开(释放锁),不想吃饭就直接离开(释放锁)。如果吃完了还想吃,就主动等待下一次“开饭了”的消息(wait)。

食堂通知一个人来吃饭(notify),此人来到打饭窗口(获得锁)打饭(runnable),其他人都在等待开饭的消息(waiting)。如果想吃饭就打完饭后离开(释放锁),不想吃饭就直接离开(释放锁)。如果吃完了还想吃,就主动等待下一次“开饭”的消息(waiting)。
notify不能保证通知到真正想吃饭的人。

举例2:

两个生产者p1、p2,两个消费者c1、c2,共同操作一个队列,队列最大长度为1。

开始p1、p2、c1、c2都处于运行状态(runnable)。

c1先获得锁,p1、p2、c2为blocked状态。c1发现队列为空,主动进入waiting。c2接着获得锁,成为runnable状态,发现队列为空,主动进入waiting。

p1接着获得锁,成为runnable状态,在队列中插入一个元素,notify到了另一个生产者p2。p1循环生产,发现队列不为空,成为waiting。

p2成为runnable状态,发现队列有值,主动进入waiting。

此时锁已被释放,但p1、p2、c1、c2都处于waiting状态,没有线程去获取锁,死了。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网