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

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,一经查实,立即删除!

相关文章

linux检查系统硬件信息命令,Linux查看系统信息(硬件信息, 系统设置信息等) 命令 | Soo Smart!...

Linux 查看系统信息命令是linux初学者必备的基础知识, 这些命令也非常有用, 因为进入linux第一件事就可能是首先查看系统信息, 因此必要的系统的学习一下这些linux系统信息命令还是非常有必要的!下面给除了各linux发行版比较常用的系统信息查询的命令, 大家可以参考, 同时也可以…

在Orchard中使用Image Gallery模块

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

宝宝的成长脚印6/15

这半个多月来 在六一儿童节这天,中午带宝宝去一家杂货店门口坐了几分钟喜洋洋摇摇车,傍晚时带他去公园玩滑梯,坐转马,晚上请他吃火车头盒饭 小家伙自己拿勺吃饭越来越稳了,但还需要喂,有时喂他吃时会吃一两…

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”这是我们上个月去到的一家中国代工厂工厂内部人员向我们透露的他说,其实无论是纪梵希、爱马仕、…

python execute_command err_Python management.execute_from_command_line方法代碼示例

本文整理匯總了Python中django.core.management.execute_from_command_line方法的典型用法代碼示例。如果您正苦於以下問題:Python management.execute_from_command_line方法的具體用法?Python management.execute_from_command_line怎麽用?…

linux脚本多线程,Shell多线程操作及线程数控制实例

前言在业务开发过程中,经常会在后台写一些shell脚本处理数据,但估计很多人不知道shell脚本也可以支持多线程,而且非常简单。本篇文章主要就是介绍shell实现多进程以及进程数量控制。需求为了更好的说明问题,我们结合例子讲解&…

Node.js Undocumented(2)

写这种系列blog,是为了监督自己,不然我估计我不会有动力写完。这一节,我将介绍下Buffer这个module。js本身对文本友好,但是处理二进制数据就不是特别方便,因此node.js提供了Buffer模块来帮助你处理二进制数据&#xff…

注册asp.net 4.0 到iis

如果没有按照正常的先装iis后装.net的顺序,可以使用此命令重新注册一下: 32位的Windows:---------------------------------------------------------------------------1. 运行->cmd 2. cd C:\Windows\Microsoft.NET\Framework\v4.0.30…

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

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

python怎么处理异常然后继续_Python异常处理-返回行,继续

通常,在try块内触发异常后,您永远都无法将执行返回到特定的代码段,因为该异常可能在很深的某个地方发生,并受其他线程的其他副作用影响的许多其他状态.尽管您的程序可能不是这种情况,但是鉴于没有通用的解决方案允许在Python中进行此操作,因此使用异常处理基本上不可能实现您想…

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

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

SQL server 2000 和2005中怎么让ldf文档变小

SQL server 2005 打开数据库-- 新建查询--输入以下两条命令: Dump transaction databasename with no_log backup log databasename with no log --然后选择数据库--收缩--文件-- 选择日志--选择收缩方式里到xxMB,然后就可以了。 en:chose database--shrink-- file-…

MyEclipse JAVA提示信息配置

1.内容提示 1.1 Windows>Preferences>Java>Editor>Content Assists 找到”auto activation triggers for Java“ 输入框,初始为’.,改为‘.abc. 1.2 Export Preferences配置文件取名为’1.epf,编辑‘1.epf’,找到‘.abc,改为’.abcdefghijk…

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

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

hadoop扩充磁盘操作记录

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

linux命令clock,简单了解Linux系统中clock命令的使用方法

clock 命令:设置或者显示硬件时间的近似值必要参数--adjust 自动调整硬件时钟时间--debug 运行时,输出详细的处理过程--directisa 不通过设备文件/etc/rtc,直接对硬件时钟进行存取--getepoch 输出硬件时钟的数值到标准输出--hctosys 时钟同步…

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

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

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

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