生产者消费者_【线程通信】生产者消费者模型
生产者消费者模型,是每一个学习多线程的的人都需要知道的模型;
大致情况就是:有两个线程,一个负责生产产品,一个消费产品,两者公用同一块内存区域,也就是产品放在了同一块内存上面,如果两个线程没有采用一定的措施或者采用的策略错误的情况下,容易出现一系列的问题,例如数据一致性问题,死锁问题;
2为什么需要生产者消费者模型在多线程世界里,生产者就是生产数据的线程,消费者就是消费数据的线程;如果生产者处理速度很快,而消费者处理速度很慢,那么生产者就必须等待消费者处理完,才能继续生产数据;同样的道理,如果消费者的处理能力大于生产者,那么消费者就必须等待生产者;为了解决这个问题于是引入了生产者和消费者模式。3生产者-消费者模型(线程阻塞,线程唤醒)
举例:线程1去奶茶,没有奶茶了,它就不执行了;线程二生产奶茶,通知线程1继续执行;
下面这个例子不大好,使用了Java线程已经抛弃的方法
打印结果如下,最开始没奶茶,后来有了奶茶通知了挂起的线程,那个线程就得以继续执行
上面这个就是经典的生产者-消费者模型,但是为啥这个例子当中的线程方法被弃用了呢?往下看一个例子
suspend和resume加锁导致死锁
打印结果
这个线程不用等了,一直都是在这里挂起了,竞争不到锁,没办法通知挂起的线程继续执行;
如果suspend比resume慢执行,也会导致线程永久挂起
打印结果,通知完了,那边才开始挂起
那么Java现在推荐哪一种方式进行使用呢~
wait/notify机制
这个机制要求这两个方法只能由同一对象锁的持有者线程进行调用,也就是卸载同步代码块里面,否则会抛出
IllegalMonitorStateException异常;
wait方法导致当前的线程进入等待状态,加入该对象的等待集合中,并发放弃当前持有的对象锁;
notify/notifyAll方法唤醒一个或所有正在等待这个对象锁的线程;
注意:虽然会wait自动解锁,但是对顺序有要求,如果在notify被调用之后才开始wait方法的调用,线程会永远处于WAITING状态
先来一个正常的演示(打印跟前面正常的一致)
可以看到,如果是suspend/resume的话,这个程序是会导致死锁的,可是这里采用的是wait/notify机制,会自动释放锁
如果notify比waiting先执行,
那么会导致线程一直处于WAITING的状态
说个题外话,我觉得这个就跟你的女神已经通知你,我们不可能在一起了,然后你还一直在等待
还有另外一个机制
park/unpark机制
park表示等待一个“许可”
unpark表示授予一个"许可"
park/unpark机制有一个好处就是如果提前颁发“许可”了
也不会导致线程一直处于挂起或者是死锁的转态
但是它不会主动去释放锁
park比unpark提前执行的例子
本样式由135编辑器出品,不允许任何第三方编辑器抄袭使用,违者
加锁导致死锁的例子
【总结】
suspend/resume机制
resume先执行,suspend慢执行;resume/suspend加锁;都会导致死锁
wait/notify机制
wait/notify加锁了会自动释放锁,但是notify比wait先执行依然会线程永久挂起
park/unpark机制
park/unpark不会自动释放锁,但是先后执行顺序不会导致线程永久挂起
【提醒】
代码当中使用if语句来判断是否进入等待状态,
是错误的
官方建议是采用while情况下,判断是否可以将线程挂起
生产者消费者_【线程通信】生产者消费者模型相关推荐
- python 异步 生产者 消费者_python 线程通信 生产者与消费者
1 """ 2 线程通信的生产者与消费者3 python的queue模块中提供了同步的线程安全的队列类,都具有原子性,实现线程间的同步4 Queue (FIFO: fis ...
- java的知识点34——线程通信 || 生产者与消费者问题
线程通信 应用场景:生产者和消费者问题 • 假设仓库中只能存放一件产品,生产者将生产出来的产品放入仓库,消费者将仓库中产品取走消费 • 如果仓库中没有产品,则生产者将产品放入仓库,否则停止生产并等待, ...
- 生产者消费者伪码_[线程同步]生产者消费者代码实现
生产者消费者问题是一个著名的线程同步问题,该问题描述如下: 有一个生产者在生产产品,这些产品将提供给若干个消费者去消费,为了使生产者和消费者能并发执行,在两者之间设置一个具有多个缓冲区的缓冲池,生产者 ...
- 同软件多个线程设置不同ip_5-13网络编程(附带多线程死锁,线程通信)
0513多线程 死锁 当线程任务中出现了多个同步(多个锁)时,如果同步中嵌套了其他的同步.这时容易引发一种现象:程序出现无限等待,这种现象我们称为死锁 线程通信 生产者消费者模式 模拟街道案例 wai ...
- 高并发编程-线程通信_使用wait和notify进行线程间的通信2_多生产者多消费者导致程序假死原因分析
文章目录 概述 jstack或者可视化工具检测是否死锁(没有) 原因分析 概述 高并发编程-线程通信_使用wait和notify进行线程间的通信 - 遗留问题 我们看到了 应用卡住了 .... 怀疑是 ...
- java 生产者消费者_Java多线程:线程间通信—生产者消费者模型
一.背景 && 定义 多线程环境下,只要有并发问题,就要保证数据的安全性,一般指的是通过 synchronized 来进行同步. 另一个问题是, 多个线程之间如何协作呢 ? 我们看一个 ...
- Java多线程---线程通信(wait,notifyAll,生产者消费者经典范式,owner wait set,自定义显式锁BooleanLock)
转自:https://blog.csdn.net/qq_35995514/article/details/91128585 1 学习内容 notifyAll 生产者.消费者经典范式 线程休息室 wai ...
- 采用信号量机制实现消费者与生产者的线程同步_Java线程通信
线程通信是Java线程部分的重点,我们介绍一下常见的几种线程通信方式. 线程锁与同步 锁机制是线程通信的一种重要方式.当多个线程竞争某一个对象时,一旦某个线程获得对象就会立刻将其上锁,其他线程只能等待 ...
- 线程通信:生产者消费者问题
1.应用场景: 假设仓库中只能放一件产品,生产者将生产出来的产品放入仓库,消费者将仓库中的产品取走. 如果仓库中没有产品,则生产者将产品放入仓库,否则停止生产并等待,知道仓库中的产品被消费者取走为止. ...
最新文章
- Java CAS AtomicInteger使用
- Oralce中备份,还原数据库
- 理解关于java反射中类的域及修饰符
- AKS开讲啦! | DevOps with AKS
- 大根堆的删除c语言,大根堆和小根堆的C语言实现
- 无聊的三月终于过去了
- C# 编译后执行bat等脚本文件 运行脚本文件 执行Copy 执行XCopy
- UVA1292-----Strategic game-----树形DP解决树上的最小点覆盖问题
- 聚类算法——KMeans(K-均值)
- css 动效彩旗飘扬
- 2023年湖北安全员ABC报名时间和考试时间是什么时候?甘建二
- 沁恒CH552 USB学习之旅(一)
- 【对比+转载】麦子:我奋斗了18年才和你坐在一起喝咖啡清华大学硕士: 我奋斗了18年,不是为了和你一起喝咖啡
- 补充layui的复选框必选一项或若干项,不选中或者点击提交都可提示错误信息
- 【第75篇】Wise-IoU:基于动态聚焦机制的边界框回归损失
- 关于微信小程序“南安明朗教育”活动页面错误问题记录
- 魔幻离现实仅一步之遥:细说Python的循环调用、循环引用和循环导入
- 下载spring 5
- 哈佛校长演讲:学会尊重不同意见,世界不会因为你是哈佛毕业生而善待你
- 大道至简-第四章-心得体会
热门文章
- 微服务探索与实践—总述
- 不装 VS 自己编译安装 Windows Terminal
- ML.NET 发布0.11版本:.NET中的机器学习,为TensorFlow和ONNX添加了新功能
- NET Core微服务之路:SkyWalking+SkyApm-dotnet分布式链路追踪系统的分享
- 我们为什么要搞长沙.NET技术社区(三)
- 【NET CORE微服务一条龙应用】第二章 配置中心使用
- 好代码是管出来的——使用Git来管理源代码
- 从Xamarin.Essentials谈Xamarin库的封装
- 把旧系统迁移到.Net Core 2.0 日记(2) - 依赖注入/日志NLog
- 使用 dotnet core 和 Azure PaaS服务进行devOps开发(Web API 实例)