1生产者消费者模型介绍

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

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

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情况下,判断是否可以将线程挂起

生产者消费者_【线程通信】生产者消费者模型相关推荐

  1. python 异步 生产者 消费者_python 线程通信 生产者与消费者

    1 """ 2 线程通信的生产者与消费者3 python的queue模块中提供了同步的线程安全的队列类,都具有原子性,实现线程间的同步4 Queue (FIFO: fis ...

  2. java的知识点34——线程通信 || 生产者与消费者问题

    线程通信 应用场景:生产者和消费者问题 • 假设仓库中只能存放一件产品,生产者将生产出来的产品放入仓库,消费者将仓库中产品取走消费 • 如果仓库中没有产品,则生产者将产品放入仓库,否则停止生产并等待, ...

  3. 生产者消费者伪码_[线程同步]生产者消费者代码实现

    生产者消费者问题是一个著名的线程同步问题,该问题描述如下: 有一个生产者在生产产品,这些产品将提供给若干个消费者去消费,为了使生产者和消费者能并发执行,在两者之间设置一个具有多个缓冲区的缓冲池,生产者 ...

  4. 同软件多个线程设置不同ip_5-13网络编程(附带多线程死锁,线程通信)

    0513多线程 死锁 当线程任务中出现了多个同步(多个锁)时,如果同步中嵌套了其他的同步.这时容易引发一种现象:程序出现无限等待,这种现象我们称为死锁 线程通信 生产者消费者模式 模拟街道案例 wai ...

  5. 高并发编程-线程通信_使用wait和notify进行线程间的通信2_多生产者多消费者导致程序假死原因分析

    文章目录 概述 jstack或者可视化工具检测是否死锁(没有) 原因分析 概述 高并发编程-线程通信_使用wait和notify进行线程间的通信 - 遗留问题 我们看到了 应用卡住了 .... 怀疑是 ...

  6. java 生产者消费者_Java多线程:线程间通信—生产者消费者模型

    一.背景 && 定义 多线程环境下,只要有并发问题,就要保证数据的安全性,一般指的是通过 synchronized 来进行同步. 另一个问题是, 多个线程之间如何协作呢 ? 我们看一个 ...

  7. Java多线程---线程通信(wait,notifyAll,生产者消费者经典范式,owner wait set,自定义显式锁BooleanLock)

    转自:https://blog.csdn.net/qq_35995514/article/details/91128585 1 学习内容 notifyAll 生产者.消费者经典范式 线程休息室 wai ...

  8. 采用信号量机制实现消费者与生产者的线程同步_Java线程通信

    线程通信是Java线程部分的重点,我们介绍一下常见的几种线程通信方式. 线程锁与同步 锁机制是线程通信的一种重要方式.当多个线程竞争某一个对象时,一旦某个线程获得对象就会立刻将其上锁,其他线程只能等待 ...

  9. 线程通信:生产者消费者问题

    1.应用场景: 假设仓库中只能放一件产品,生产者将生产出来的产品放入仓库,消费者将仓库中的产品取走. 如果仓库中没有产品,则生产者将产品放入仓库,否则停止生产并等待,知道仓库中的产品被消费者取走为止. ...

最新文章

  1. Java CAS AtomicInteger使用
  2. Oralce中备份,还原数据库
  3. 理解关于java反射中类的域及修饰符
  4. AKS开讲啦! | DevOps with AKS
  5. 大根堆的删除c语言,大根堆和小根堆的C语言实现
  6. 无聊的三月终于过去了
  7. C# 编译后执行bat等脚本文件 运行脚本文件 执行Copy 执行XCopy
  8. UVA1292-----Strategic game-----树形DP解决树上的最小点覆盖问题
  9. 聚类算法——KMeans(K-均值)
  10. css 动效彩旗飘扬
  11. 2023年湖北安全员ABC报名时间和考试时间是什么时候?甘建二
  12. 沁恒CH552 USB学习之旅(一)
  13. 【对比+转载】麦子:我奋斗了18年才和你坐在一起喝咖啡清华大学硕士: 我奋斗了18年,不是为了和你一起喝咖啡
  14. 补充layui的复选框必选一项或若干项,不选中或者点击提交都可提示错误信息
  15. 【第75篇】Wise-IoU:基于动态聚焦机制的边界框回归损失
  16. 关于微信小程序“南安明朗教育”活动页面错误问题记录
  17. 魔幻离现实仅一步之遥:细说Python的循环调用、循环引用和循环导入
  18. 下载spring 5
  19. 哈佛校长演讲:学会尊重不同意见,世界不会因为你是哈佛毕业生而善待你
  20. 大道至简-第四章-心得体会

热门文章

  1. 微服务探索与实践—总述
  2. 不装 VS 自己编译安装 Windows Terminal
  3. ML.NET 发布0.11版本:.NET中的机器学习,为TensorFlow和ONNX添加了新功能
  4. NET Core微服务之路:SkyWalking+SkyApm-dotnet分布式链路追踪系统的分享
  5. 我们为什么要搞长沙.NET技术社区(三)
  6. 【NET CORE微服务一条龙应用】第二章 配置中心使用
  7. 好代码是管出来的——使用Git来管理源代码
  8. 从Xamarin.Essentials谈Xamarin库的封装
  9. 把旧系统迁移到.Net Core 2.0 日记(2) - 依赖注入/日志NLog
  10. 使用 dotnet core 和 Azure PaaS服务进行devOps开发(Web API 实例)