生产者消费者_【线程通信】生产者消费者模型

1生产者消费者模型介绍

    生产者消费者模型,是每一个学习多线程的的人都需要知道的模型;

大致情况就是:有两个线程,一个负责生产产品,一个消费产品,两者公用同一块内存区域,也就是产品放在了同一块内存上面,如果两个线程没有采用一定的措施或者采用的策略错误的情况下,容易出现一系列的问题,例如数据一致性问题,死锁问题;

2be1db0a540c03191221ad0f2a9220ea.png

2为什么需要生产者消费者模型在多线程世界里,生产者就是生产数据的线程,消费者就是消费数据的线程;如果生产者处理速度很快,而消费者处理速度很慢,那么生产者就必须等待消费者处理完,才能继续生产数据;同样的道理,如果消费者的处理能力大于生产者,那么消费者就必须等待生产者;为了解决这个问题于是引入了生产者和消费者模式。3生产者-消费者模型(线程阻塞,线程唤醒)

    举例:线程1去奶茶,没有奶茶了,它就不执行了;线程二生产奶茶,通知线程1继续执行;

下面这个例子不大好,使用了Java线程已经抛弃的方法e65891ff86d2b141a2a8c4bdbec5b022.png

打印结果如下,最开始没奶茶,后来有了奶茶通知了挂起的线程,那个线程就得以继续执行

9fbace63eacb23e19a752c4d10acbe9e.png

上面这个就是经典的生产者-消费者模型,但是为啥这个例子当中的线程方法被弃用了呢?往下看一个例子

suspend和resume加锁导致死锁

07de13e883dc9c72ab5bdd74c20c1f4a.png

打印结果

e5051a5f12ddda9ac68b7f77a2680868.png

这个线程不用等了,一直都是在这里挂起了,竞争不到锁,没办法通知挂起的线程继续执行;

如果suspend比resume慢执行,也会导致线程永久挂起

e7a2c065aebff871e7cce1ae42aa7e82.png

打印结果,通知完了,那边才开始挂起

fbbe96ee079ef64979387aec309cf9f2.png

那么Java现在推荐哪一种方式进行使用呢~

wait/notify机制

这个机制要求这两个方法只能由同一对象锁的持有者线程进行调用,也就是卸载同步代码块里面,否则会抛出

IllegalMonitorStateException异常;

wait方法导致当前的线程进入等待状态,加入该对象的等待集合中,并发放弃当前持有的对象锁;

notify/notifyAll方法唤醒一个或所有正在等待这个对象锁的线程;

注意:虽然会wait自动解锁,但是对顺序有要求,如果在notify被调用之后才开始wait方法的调用,线程会永远处于WAITING状态

先来一个正常的演示(打印跟前面正常的一致)

37027edea70e9fd98ba29e0de19de96b.png

可以看到,如果是suspend/resume的话,这个程序是会导致死锁的,可是这里采用的是wait/notify机制,会自动释放锁

如果notify比waiting先执行,

那么会导致线程一直处于WAITING的状态

737581b1f782bdefdaa7c2c1cb5cb734.png

说个题外话,我觉得这个就跟你的女神已经通知你,我们不可能在一起了,然后你还一直在等待

还有另外一个机制

park/unpark机制

park表示等待一个“许可”

unpark表示授予一个"许可"

park/unpark机制有一个好处就是如果提前颁发“许可”了

也不会导致线程一直处于挂起或者是死锁的转态

但是它不会主动去释放锁

park比unpark提前执行的例子

e5051a5f12ddda9ac68b7f77a2680868.png本样式由e5051a5f12ddda9ac68b7f77a2680868.png135编辑器出品,不允许任何第三方编辑器抄袭使用,违者

284ee741b8b18d6a7d26ab3179ab6b27.png

加锁导致死锁的例子

b7bc35e89d3afb64db89558cb6f6ccfe.png

【总结】

suspend/resume机制

resume先执行,suspend慢执行;resume/suspend加锁;都会导致死锁

wait/notify机制

wait/notify加锁了会自动释放锁,但是notify比wait先执行依然会线程永久挂起

park/unpark机制

park/unpark不会自动释放锁,但是先后执行顺序不会导致线程永久挂起

【提醒】

代码当中使用if语句来判断是否进入等待状态,

是错误的

官方建议是采用while情况下,判断是否可以将线程挂起

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/296946.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在Orchard中使用Image Gallery模块

作为ASP.NET MVC领域一款优秀的开源CMS,Orchard值得所有.NET Web开发人员学习和研究,然后二次开发,最后在其基础上创新。也是遵循国内人员学习IT技术的路线:引进->吸收->消化。 Orchard有很多优秀的功能,在此不一…

Dapr + .NET 实战(十二)服务调用之GRPC

欢迎大家参加4小时Dapr.NET 5的实战课程课程链接 https://ke.qq.com/course/4000292?tuin1271860f什么是GRPCgRPC 是一种与语言无关的高性能远程过程调用 (RPC) 框架。gRPC 的主要优点是:高性能轻量级 RPC 框架。协定优先 API 开发,默认使用协议缓冲…

SCVMM 2012 R2运维管理九之:添加非信任的Hyper-v主机和群集

SCVMM 2012 R2运维管理九之:添加非信任的Hyper-v主机和群集之前的博文中我们为各位朋友介绍了如何向SCVMM中添加受信任的Hyper-v的主机和群集,相信大家也都已经有了一个比较深刻的理解,那么今天的博文中就来和大家聊聊:如何添加非受信任的Hyp…

走访近20家代工厂后:近千块的大牌T恤,成本只要几十块

▲ 点击查看“很多人都知道大牌有溢价但是不知道大牌溢价逼近900%打个比方一件1000块的T恤,T恤成本如果是100那么剩下的900,算是买了个大牌logo”这是我们上个月去到的一家中国代工厂工厂内部人员向我们透露的他说,其实无论是纪梵希、爱马仕、…

公开征集 | 每个人都可以成为 COSCon'21 主论坛的开源明星

“ 点击蓝字 / 关注我们 ”| 作者:COSCon21 组委会| 编辑:钱奕| 设计:朱亿钦| 责编:沈于蓝在开源的世界里,我们常常说 Community > Code(社区重于代码),Community 一词在…

linux 编写脚本示范,Linux-scripts-简单脚本和脚本的执行

9.Scripts9.1什么是 Shell scriptsshell script 是利用 shell 的功能所写的一个『程序 (program)』,这个程序是使用纯文本文件,将一些 shell 的语法与指令(含外部指令)写在里面,搭配正规表示法、管线命令与数据流重导向等功能,以达…

被质疑“在开源社区执行微软意愿”,.NET 基金会前董事为其提交的 PR 道歉并辞职...

编译|燕珊.NET基金会最近“不太平”。上周五,.NET 基金会执行董事 Claire Novotny 在其成员反对她对其中一个项目的干预后,为自身的行为道歉并宣布辞去职务。巧合的是一个多月前,董事会成员 Rodney Littles II 因与基金会的目标方…

hadoop扩充磁盘操作记录

记录cloudera扩充磁盘1、4台主机,每台主机增加一块2TB的硬盘2、首先简单说明步骤A、分区,挂载(挂载目录(名称,路径)要一致)B、在挂载的分区内,建立对应的文件夹,并授权C、…

单身两年以上是什么体验?

1 单身两年以上是什么体验?2 这群熊孩子,不当演员可惜了。。3 我要出去!我要见园长!我为幼儿园立过功!我为幼儿园卖过萌!4 当心!陷阱!!5 一位主人抓拍下了自家的柴犬宝宝…

wince导航_宁可用手机导航,也不用汽车导航?

很多车主朋友在开车的时候,比较青睐的是手机导航而不是汽车导航。笔者我也是一个车主,我在开车的时候也是比较青睐手机导航而不是汽车导航,我认为主要是有以下几个原因:车载导航的准确性没有手机导航的高。很多车载导航的地图是在…

功能导航设计器

本程序使用C#编写;此模块作用为让程序功能使用人员直观的知道程序功能模块的先后顺序和操作的先后顺序;原理为客户端通过设计器设置程序的功能流程;并保存的文件服务器上;在使用人员程序中可以直观的调出程序模块的图示&#xff1…

.Net Core with 微服务 - 使用 AgileDT 快速实现基于可靠消息的分布式事务

前面对于分布式事务也讲了好几篇了(可靠消息最终一致性分布式事务 - TCC分布式事务 - 2PC、3PChttps://github.com/kklldog/AgileDT 开源不易,大家多多 ✨✨✨回顾 前面一篇文章(可靠消息最终一致性 )我们详细介绍了基于可靠消息的分布式事务。为了更好的…

一位汉子的恋爱心得

1 每天早上起床的你。。2 喂,你怎么不理我!3 最新防撕家方法。。4 塑料姐妹花,离得远显脸小。。心疼左一!5 国外一位汉子的恋爱心得……6 当有人跟你说“追星有什么用,那些人也不认识你”。。你点的每个赞,…

放大器非线性失真研究装置_高效布里渊光纤放大器

来源:PTB新闻 主要适用于以下领域:精确的光频传输,例如用于光学时钟的远距离比较 双向放大器对于在长距离光纤链路上传输超稳定的光频必不可少,它们可以补偿光损耗,大约每100千米20 dB。由德国联邦物理技术研究院(PTB)…

利用“多说”制作留言板、评论系统

留言板和评论系统在网站建设中会经常用到,今天为大家介绍如何利用多说来为自己的网站制作留言板、评论系统!注意以下只是介绍一下简单的创建设置,更多功能大家可以自己去探索! 1、进入多说网站 http://duoshuo.com/ 并且登录。 2、…

CSS边界属性的负值

在CSS中,如果边界属性取值为负值的时候,元素之间的关系就会因此而变得复杂很多。 在垂直方向上,两个元素的边界仍然会重叠,但是此时一个为正值,一个为负值,最后的取值并不是取其中较大的正值,而…

linux切换到docker目录,Linux更改Docker运行根目录的方法

许多Linux用户在安装系统的时候,并没有分配/var分区,而在安装Docker后才发现,它的默认存放位置是在/var/lib/docker。因此导致了Docker在运行的很慢,那么要怎么解决这个问题呢?下面一起来看看解决的方法吧。解决方法:…

10岁高分考上大学,16岁读博的95后神童张炘炀,活成了他想要的样子吗?

全世界只有3.14 % 的人关注了爆炸吧知识开启学神模式走上人生巅峰指日可待时间过得真快,今年的暑假没几天就要结束了,刚参加完高考的孩子也将步入大学,开启人生的新一段旅程。 说起上大学,这让超模君想起了少年天才、神童张炘炀。…

带有控制按钮的图片滚动

上一次写了一个图片自动滚动功能,没有左右按钮控制的功能。今天花了点时间,写了一个带有左右按钮控制的图片滚动效果。所谓自动滚动,原理就是周期性的执行一个效果。在js中,通常是用setInterval这个函数来执行的,setIn…

Win11代言人官宣

微软宣布李现为中国市场的“微软零售全品牌大使”,代言全新 Windows 11、Surface 和 Microsoft 365 等产品。微软全新发布的 Windows 11 操作系统,简洁高效,带来耳目一新的视觉和使用体验全新升级的新一代 Surface Pro 8 惊艳上市&#xff0…