基于队列的生产消费设计java_生产者-消费者设计模式
一、生产者消费者设计模式
1、中间队列
一段内存空间,且可存取;
2、两种角色
(1)生产者:生产数据;
(2)消费者:消费数据。
3、三种关系
(1)生产者与生产者的互斥关系;
(2)消费者与消费者的互斥关系;
(3)生产者与消费者的互斥且同步关系。
二、实现方式
1、使用synchronized(wait()和notify())
2、使用Lock实现(await()和signal())
3、阻塞队列实现
三、生产者-消费者模型的优点
1、解耦:降低生产者和消费之间的依赖关系
2、支持并发
即生产者和消费者是两个可以独立的并发主体,互不干扰的运行,如果没有中间的环节,则会生产者阻塞或者消费者阻塞。不管是哪种方法效率都比较低。
3、支持盲闲不均
如果生产数据的速度时快时慢,缓冲区可以对其进行适当缓冲。当生产的数据太块时,消费者来不及处理,未处理的数据可以暂时存在缓冲区。等生产者的生产速度慢下来,消费者再慢慢处理掉。
四、提升与思考
1、队列可以有多种实现:
(1)先放先出:FIFO
(2)后放先出:LIFO
(3)优先级队列:Priority Queue
2、为什么生产和消费要用多线程
单线程太耗时,只有当多线程的效率提升可以抵消开发难度和性能消耗时才有必要用多线程;
3、别忘记sychronized和notifyAll()
否则其他线程一直等待,不会继续
4、生产线程和消费线程的数量匹配
上述问题可以只有一个生产线程和一个消费线程(PIPE模式)
当生产比较费时的时候生产线程多一些,消费耗时时(如网络IO)多一些消费线程(一对多对应线程池的WorkThread设计模式)
5、当生产者生产效率比较低时
可以增加生产者或者减少消费者
6、当消费者效率较高时
可以减少生产者或者增加消费者
五、基于单向链表的生产者消费者模型
1、我们这里用一个单链表当做那段共享内存,简单实现生产者消费者模型;
2、锁:同步的最常见方法是使用锁,锁是一种非强制机制,每一个线程在访问数据或资源之前先试图获取锁,并在访问结束之后释放锁,在锁已经被占用时试图获取锁,线程会等待,直到锁重新可用。
3、条件变量:
与互斥锁不同,条件变量是挂起等待而不是上锁,条件变量用来自动阻塞一个线程,直到某特殊情况的发生,通常条件变量和互斥锁同时使用。
条件变量是利用线程间共享的全局变量进行同步的一种机制,主要包括两个动作:一个线程等待”条件变量的条件成立”而挂起。
其次,线程可以唤醒条件变量,此时某个或多个等待此条件变量的线程都会被唤醒并继续支持。
条件的检测是在互斥锁的保护条件下进行的,如果一个条件为假,一个线程自动阻塞,并释放等待状态的互斥锁,如果一个线程改变了条件,与它关联的条件变量,唤醒一个或多个等待的线程,重新获得互斥锁,然后重新评价条件.如果两个线程共享读写的内存,条件变量可以实现这两个进程间的线程同步。
基于队列的生产消费设计java_生产者-消费者设计模式相关推荐
- Django项目实践(商城): 六、生产者消费者设计模式
(根据居然老师直播课内容整理) 一.生产者消费者设计模式简介 生产者消费者设计模式是一种专门解耦同步问题的设计模式,类似单例设计模式,专门解决某类问题 1.什么是生产者消费者模式 在软件开发的过程中, ...
- 架构设计:生产者/消费者模式 第3页:队列缓冲区
2019独角兽企业重金招聘Python工程师标准>>> [2]:队列缓冲区 经过前面两个帖子的铺垫,今天终于开始聊一些具体的编程技术了.由于不同的缓冲区类型.不同的并发场景对于具体的 ...
- 2.6操作系统(生产者消费问题 多生产者—消费者问题 吸烟者问题)
目录 1.生产者消费问题 能否改变相邻P.V操作的顺序? 2.多生产者-消费者问题 如何实现? 可不可以不用互斥信号量? 如果盘子(缓冲区)容量为2 知识回顾与重要考点 3.吸烟者问题 如何实现 个 ...
- 生产者/消费者设计模式(转载)
★简介 在实际的软件开发过程中,经常会碰到如下场景:某个模块负责产生数据,这些数据由另一个模块来负责处理(此处的模块是广义的,可以是类.函数.线程.进程等).产生数据的模块,就形象地称为生产者:而处理 ...
- 高并发编程之生产者—消费者设计模式
一.生产者-消费者模式介绍 生产者消费者模式是通过一个容器来解决生产者和消费者的强耦合问题.生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接 ...
- Java多线程之并发协作生产者消费者设计模式
转载请注明出处:blog.csdn.net/linglongxin- 两个线程一个生产者个一个消费者 需求情景 两个线程,一个负责生产,一个负责消费,生产者生产一个,消费者消费一个 涉及问题 同步问题 ...
- java 消费者 生产者 队列_用Java写一个生产者-消费者队列
packageyunche.test.producer;importjava.util.LinkedList;importjava.util.Random;/*** @ClassName: Produ ...
- 架构设计:生产者/消费者模式 第6页:环形缓冲区的实现
2019独角兽企业重金招聘Python工程师标准>>> ◇判断"空"和"满" 上述的操作并不复杂,不过有一个小小的麻烦:空环和满环的时候,R和 ...
- 生产者消费者设计模式
转载:https://www.jianshu.com/p/71a5089afe13 场景 生产者生产数据,消费者消费数据: 但是性能处理速度均有差异,因而需要一个中间队列协调: 举例 3个厨师做甜点, ...
最新文章
- java连接Hbase数据库
- 让Windows下Git和TortoiseGit支持中文文件名/UTF-8
- springboot中java泛型使用
- 如何在Kali Linux中安装Google Chrome浏览器
- c语言两个for语句并列执行_C语言两个for语句如何并列编写?
- debug LUW3 - callback workflow - ABAP工作流的调试(第三部分)
- [翻译]初试C# 8.0
- 微信暂停新用户注册标志一个时代的结束
- ProtoBuf 常用序列化/反序列化API
- gem install sass 本地配置和淘宝源无效的解决办法
- js获得服务器时间并实时更新
- sqlserver html文档,[SQLServer]从SQL中的一个表中导出HTML文件表格
- 开源.Net邮件服务器-LumiSoft Mail Server简介
- mybatis update 不为空的_详解MyBatis-Plus updateById方法更新不了空字符串/null解决方法...
- 有关学习Android资料的一些网站
- KK录像机怎么用?KK录像机使用方法介绍
- 2万字软件测试面试题干货带答案,反手我就一个收藏
- RT_Thread操作系统配置环境EVN学习笔记
- 【The 13th Chinese Northeast Collegiate Programming Contest】I. Temperature Survey
- 2020-10-15(重力场、拖拽、轮播图)
热门文章
- 特征工程之MinMaxScaler、StandardScaler、Normalizer、Binarizer
- 机器学习数据清洗之缺失值处理、缺失的原因、缺失值删除、缺失值填充、KNN填充
- linux硬件配置软件,洞悉Linux系统软硬件配置
- Linux rm过滤后的目录6,Linux的部分命令
- java测试时间的类,java 测试五种单例模式需要的时间
- 一键编译php,编译安装php 附加一键安装php5.6.30脚本
- ART的安装和简单使用
- LoRDEC: a tool for correcting errors in long sequencing reads 纠正长序列读取错误的工具
- mysql join not in_MySQL 使用左连接替换not in
- MySQL 约束类型