读者与写者、生产者与消费者

1、读者写者

写者:写数据

读者:仅仅是读数据,不存在取走数据

写者与写者关系:互斥

读者与读者关系:没有关系

写者与读者关系:同步、互斥

解决方法:

1)读者优先:读者正在读,写者不能终止读者,直到读者读完,写者才能写入

2)写者优先:写者正在写,读者不能终止写者,直到写者写完,读者才能写入

2、生产者消费者

生产者:产生数据

消费者:取走数据

生产者与生产者:互斥关系

消费者与消费者:互斥关系

生产者与消费者:互斥、同步关系

生产者的主要作用是生成一定量的数据放到缓冲区中,然后重复此过程。与此同时,消费者也在缓冲区消耗这些数据。该问题的关键就是要保证生产者不会在缓冲区满时加入数据,消费者也不会在缓冲区中空时消耗数据。

要解决该问题,就必须让生产者在缓冲区满时休眠,等到下次消费者消耗缓冲区中的数据的时候,生产者才能被唤醒,开始往缓冲区添加数据。同样, 也可以让消费者在缓冲区空时进入休眠,等到生产者往缓冲区添加数据之后,再唤醒消费者。

3、区别

1)数据一直都存在,不存在有空位才能写,有数据才能读的问题,写者写可以覆盖之前的值,读者不会消费数据,数据不会消失。

2)允许多个读者同时并发访问,而消费者却要互斥,写者不仅要和写者之间互斥,还要与读者也互斥,对于生产者/消费者只需与自身互斥。

时间: 2024-10-13 07:22:11

读者与写者、生产者与消费者的相关文章

kafka集群搭建和使用Java写kafka生产者消费者

 kafka集群搭建 Java代码   1.zookeeper集群  搭建在110, 111,112 2.kafka使用3个节点110, 111,112 修改配置文件config/server.properties broker.id=110 host.name=192.168.1.110 log.dirs=/usr/local/kafka_2.10-0.8.2.0/logs 复制到其他两个节点,然后修改对应节点上的config/server.pro 3.启动,在三个节点分别执行 bin/kaf

利用BlockingCollection实现生产者和消费者队列,实现写文本

最近开发几个小项目,需要把结果写到txt文件里面,并且按照时间进行分文件,由于对于效率要求较高,所以采用 生产者和消费者 模型来进行写出文本,线程中只需要添加队列就立即返回,而不需要等待写文件的时间 public class WriteItem : IDisposable { public string Filename { get; } public Encoding Encode { get; } public bool Append { get; } public bool TimeNam

生产者与消费者问题

***********************************************声明****************************************************** 原创作品,出自 "晓风残月xj" 博客,欢迎转载,转载时请务必注明出处(http://blog.csdn.net/xiaofengcanyuexj). 由于各种原因,可能存在诸多不足,欢迎斧正! *******************************************

实验四、生产者和消费者

一.    实验目的 1.掌握临界区的概念及临界区的设计原则: 2.掌握信号量的概念.PV操作的含义以及应用PV操作实现进程的同步与互斥: 3.分析进程争用资源的现象,学习解决进程互斥的方法. 二.    实验内容及要求 分析进程的同步与互斥现象,编程实现经典的进程同步问题——生产者消费者问题的模拟 生产者--消费者问题表述: 有一环形缓冲池,包含n个缓冲区(0~n-1). 有两类进程:一组生产者进程和一组消费者进程,生产者进程向空的缓冲区中放产品,消费者进程从满的缓冲区中取走产品,所有进程必须

Kafka-常用术语(消息、生产者、消费者、集群、broker解释)

Kafka-常用术语(消息.生产者.消费者.集群.broker解释) 消息和批次 kafka的数据单元被称为消息.类似于数据库表中的一行数据. 消息由字节数组组成,所以对于kafka来说,消息里的数据没有特别的格式或含义. 消息可以有一个可选的元数据,也就是键,键也是一个字节数组,当消息以一种可控的方式写入不同的分区时,会用到键.最简单的例子就是为键生成一个一致性散列值,然后使用散列值对主题分区数进行取模,为消息选取分区.这样可以保证具有相同键的消息总是被写到相同的分区上. 为了提高效率,消息被

Parallel Programming-实现并行操作的流水线(生产者、消费者)

本文介绍如何使用C#实现并行执行的流水线(生产者消费者): 流水线示意图 实现并行流水线 一.流水线示意图 上图演示了流水线,action1接收input,然后产生结果保存在buffer1中,action2读取buffer1中由action1产生的数据,以此类推指导action4完成产生Output. 以上也是典型的生产者消费者模式. 上面的模式如果使用普通常规的串行执行是很简单的,按部就班按照流程图一步一步执行即可.如果为了提高效率,想使用并行执行,也就是说生产者和消费者同时并行执行,该怎么办

java多线程(同步与死锁问题,生产者与消费者问题)

首先我们来看同步与死锁问题: 所谓死锁,就是A拥有banana,B拥有apple. A对B说:你把apple给我,我就把banana给你. B对A说:你把banana给我,我就把apple给你. 但是A和B都在等待对方的答复,那么这样最终的结果就是A得不到apple,B也得不到banana.这种死循环就是死锁. 于是我们可以模拟上面的描述,写出以下代码: 类A代表A这个人, public class A { public void say(){ System.out.println("A sai

生产者与消费者模式

1 准确说应该是生产者(setter)-消费者(getter)-仓储模型,离开了仓储,生产者消费者模型就显得没有说服 2 力了. 3 >实现代码: 4 5 //1. 实体设计:同步栈仓储,共享数据域 6 class SyncStack{ 7 8 //同步栈仓储中的数据产品,默认为10个大小 9 private String[] products=new String[10]; 10 //数据产品数据的下标索引,初始化为0 11 private int index=0; 12 13 //sette

Java---20---多线程:生产者和消费者2(JDK1.5升级版)

此篇文章写的是JDK1.5升级版的生产者和消费者. Java 升级之后的解决方法: Lock java.util.concurrent.locks 接口 Lock 所有已知实现类: ReentrantLock,ReentrantReadWriteLock.ReadLock,ReentrantReadWriteLock.WriteLock public interface Lock Lock 实现提供了比使用 synchronized 方法和语句可获得的更广泛的锁定操作.此实现允许更灵活的结构,可