java notify和notifyAll的区别 首先从名字可以了解,notify是通知一个线程获取锁,notifyAll是通知所有相关的线程去竞争锁。 notify不能保证获得锁的线程,真正需要锁
来源:互联网 发布:重庆市干部网络培训 编辑:程序博客网 时间:2024/06/06 02:52
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状态,没有线程去获取锁,死了。
- java notify和notifyAll的区别 首先从名字可以了解,notify是通知一个线程获取锁,notifyAll是通知所有相关的线程去竞争锁。 notify不能保证获得锁的线程,真正需要锁
- java的线程通信wait(),notify(),notifyAll()
- java 多线程 线程之间的协作 notify()和notifyAll()
- 线程中wait、notify、notifyAll的使用方法
- java线程wait、notify、notifyAll
- JAVA -- 线程wait()、notify()、notifyAll()
- JAVA线程 -- wait notify notifyAll
- java线程:wait,notify,notifyAll
- 线程wait-notify-notifyAll
- notify() 和 notifyAll() 的区别
- notify和notifyAll的区别
- notify()和notifyAll()的区别
- notify()和notifyAll()的区别
- java 线程 错失的信号、notify() 与notifyAll的使用
- JAVA-线程系列教程<4>-wait()\notify()和notifyAll()的区别和联系
- java的锁池和等待池wait notify notifyall
- 线程之间的同步和通信,synchronized,wait(),notify(),notifyAll()
- java中notify()和notifyall的区别
- Hdu1233-还是畅通工程-【最小生成树】【Kruskal算法】
- 边框妙用的按钮
- 《打开U盘发现全部文件变成快捷方式了》
- 阿里JAVA开发手册重点摘要
- Android自定义属性,attr format取值类型
- java notify和notifyAll的区别 首先从名字可以了解,notify是通知一个线程获取锁,notifyAll是通知所有相关的线程去竞争锁。 notify不能保证获得锁的线程,真正需要锁
- Winfrom 复制谋行数据
- MySQL卸载
- svn出现仓库被锁, Please execute the 'Cleanup' command.解决方案
- typedef的用法总结
- tr下边框设置的方法
- ZigBee无线连接助力打造工业物联网
- RxJava使用场景
- Android使用矢量图(SVG, VectorDrawable)实践篇