java notify和notifyAll的对比

发布时间 - 2026-01-10 22:57:49    点击率:

 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和notifyAll  # Java的wait()  # notify()和notifyAll()使用心得  # java多线程之wait()  # notify()  # notifyAll()的详解分析  # Java 中Object的wait() notify() notifyAll()方法使用  # Java中的notyfy()和notifyAll()的本质区别  # Java多线程中wait、notify、notifyAll使用详解  # Java中notify()和notifyAll()的使用区别  # Java中notify和notifyAll的区别及何时使用  # 想吃  # 为空  # 死锁  # 打完  # 饭后  # 的人  # 都在  # 死了  # 已被  # 希望能  # 此人  # 人来  # 谢谢大家  # 正想  # 长度为  # 运行状态  # color  # style  # notifyAll 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 美食网站链接制作教程视频,哪个教做美食的网站比较专业点?  Laravel如何创建和注册中间件_Laravel中间件编写与应用流程  高端建站如何打造兼具美学与转化的品牌官网?  郑州企业网站制作公司,郑州招聘网站有哪些?  Laravel如何使用Laravel Vite编译前端_Laravel10以上版本前端静态资源管理【教程】  微信公众帐号开发教程之图文消息全攻略  详解Nginx + Tomcat 反向代理 负载均衡 集群 部署指南  小米17系列还有一款新机?主打6.9英寸大直屏和旗舰级影像  JS中对数组元素进行增删改移的方法总结  Python3.6正式版新特性预览  Laravel数据库迁移怎么用_Laravel Migration管理数据库结构的正确姿势  Edge浏览器怎么启用睡眠标签页_节省电脑内存占用优化技巧  简单实现Android文件上传  阿里云高弹*务器配置方案|支持分布式架构与多节点部署  如何快速生成专业多端适配建站电话?  微信小程序 input输入框控件详解及实例(多种示例)  Windows10怎样连接蓝牙设备_Windows10蓝牙连接步骤【教程】  用v-html解决Vue.js渲染中html标签不被解析的问题  JS中页面与页面之间超链接跳转中文乱码问题的解决办法  如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?  Laravel怎么使用Collection集合方法_Laravel数组操作高级函数pluck与map【手册】  Laravel如何处理文件下载请求?(Response示例)  如何在建站主机中优化服务器配置?  高防服务器租用指南:配置选择与快速部署攻略  bootstrap日历插件datetimepicker使用方法  为什么php本地部署后css不生效_静态资源加载失败修复技巧【技巧】  如何在 Telegram Web View(iOS)中防止键盘遮挡底部输入框  大学网站设计制作软件有哪些,如何将网站制作成自己app?  如何在香港服务器上快速搭建免备案网站?  如何确认建站备案号应放置的具体位置?  网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?  javascript基于原型链的继承及call和apply函数用法分析  html5怎么画眼睛_HT5用Canvas或SVG画眼球瞳孔加JS控制动态【绘制】  百度浏览器ai对话怎么关 百度浏览器ai聊天窗口隐藏  微信小程序 require机制详解及实例代码  详解jQuery中基本的动画方法  如何在 Go 中优雅地映射具有动态字段的 JSON 对象到结构体  高端智能建站公司优选:品牌定制与SEO优化一站式服务  Laravel Livewire是什么_使用Laravel Livewire构建动态前端界面  Laravel如何实现全文搜索_Laravel Scout集成Algolia或Meilisearch教程  EditPlus中的正则表达式实战(6)  Laravel怎么导出Excel文件_Laravel Excel插件使用教程  Android仿QQ列表左滑删除操作  Laravel Eloquent模型如何创建_Laravel ORM基础之Model创建与使用教程  网站制作免费,什么网站能看正片电影?  深圳网站制作的公司有哪些,dido官方网站?  谷歌Google入口永久地址_Google搜索引擎官网首页永久入口  Laravel如何处理异常和错误?(Handler示例)  JavaScript如何实现音频处理_Web Audio API如何工作?  重庆市网站制作公司,重庆招聘网站哪个好?