生产者和消费者场景中的问题
分享一下工作和学习中的一些知识点。
平时在许多业务场景中,总会碰到一些生产者和消费者的问题,比如生产者和消费者操作的都是同一类产品,也可以说是同一个资源,既然是同一个资源,那么就会存在线程不安全问题(也可能出现在同步方法中)。我分享一个方法,管程法

生产者

字面意思就是制造产品的一个对象,比如餐馆的厨师就是生产者,将菜品炒出来供客户享用。

消费者

就是消耗产品的一方,就比如刚举得例子里面的客户就是消费方,消费生产者生产的产品。

生产者和消费者的关系


生产者将生产出来的产品放入缓冲区,然后消费者从缓冲区去拿产品出来消费。这里用到缓冲区的原因,是因为这里演示的场景是生产者和消费者同时运行,生产者不知道我需要生产到什么时候停止,消费者也不知道我到底要消费多少,所以需要一个缓冲区来让双方知道,生产者知道我生产的产品还有多少剩余,消费者知道还有没有产品让我消费。像B2B这种业务的,我提前告诉你我能生产多少,或者消费者告诉你我要多少的,那就不存在这个问题了。(有问题还请大家评论里告诉我)

代码测试

class Test{public static void main(String[] args) {SyncBuffer syncBuffer=new SyncBuffer();new Productor(syncBuffer).start();new Consumer(syncBuffer).start();}
}//生产者,消费者,缓冲区,产品
//生产者
class Productor extends Thread{SyncBuffer syncBuffer;public Productor(SyncBuffer syncBuffer){this.syncBuffer=syncBuffer;}@Overridepublic void run() {//生产for (int i = 0; i < 100; i++) {syncBuffer.push(new Product(i));System.err.println("生产者生产了"+i+"商品");}}
}
//消费者
class  Consumer extends Thread {SyncBuffer syncBuffer;public Consumer(SyncBuffer syncBuffer){this.syncBuffer=syncBuffer;}@Overridepublic void run() {//消费for (int i = 0; i < 100; i++) {System.err.println("消费者消费了"+syncBuffer.pop().getId()+"商品");}}
}
//产品
class Product{private int id;public Product(int id) {this.id = id;}public int getId() {return id;}public void setId(int id) {this.id = id;}
}
//缓冲区
class SyncBuffer{Product [] products =new Product[10];int count=0;//生产public synchronized void push(Product product){if(count==products.length){//如果缓冲区满了,等待消费者消费try {this.wait();} catch (InterruptedException e) {e.printStackTrace();}}products[count]=product;this.notifyAll();count++;}//消费public synchronized Product pop(){if(count==0){//等待生产者生产try {this.wait();} catch (InterruptedException e) {e.printStackTrace();}}count--;Product product1 = products[count];this.notifyAll();return product1;}}

上面代码中,就有生产者,消费者,产品,缓冲区。
有一个生产者和一个消费者,生产者生产商品到缓冲区,缓冲区设置了10长度的数组缓冲,当缓冲区满了时就等待消费者消费,如果缓冲区为0就等生产者生产。其实这里我码的时候还出现一个尴尬的问题。

public synchronized Product pop(){if(count==0){//等待生产者生产try {Thread.sleep();} catch (InterruptedException e) {e.printStackTrace();}}count--;Product product1 = products[count];return product1;}```我开始使用的Thread类中的sleep()方法让线程等待,这个巨傻帽的问题- -,因为两个方法都是sync同步锁锁住了的,sleep()在休眠的时候是不会释放对象锁的,所以就等于白等。所以得用wait()方法,将锁释放后再等待,等另一方进去后再被notifyAll()唤醒。这个方法主要就是避免消费者直接去使用生产者的数据产生的安全问题。

管程法----生产者和消费者相关推荐

  1. 生产者和消费者问题-----管程法

    首先声明,本人只是为了巩固知识而写博客,如果你看了这篇博客对你有帮助,那么我很开心,如果没有帮助,那我也很遗憾,如果有错误很高兴你指出来,只希望不要骂人,谢谢. 什么是生产者和消费者 首先,我们都学过 ...

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

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

  3. Java并发编程系列18:多线程之生产者和消费者模式_信号灯法(wait/notify通知机制)

    1.生产者消费者模式 生产者消费者问题(Producer-consumer problem),也称为有限缓冲问题(Bounded-buffer problem),是一个多线程同步问题的经典案例.该问题 ...

  4. java线程之生产者与消费者

    预习java线程的三种创建方式 package com.bj.thread;import java.util.concurrent.*;/*** @FileName: TestThread* @Rem ...

  5. RabbitMQ 入门系列(2)— 生产者、消费者、信道、代理、队列、交换器、路由键、绑定、交换器

    本系列是「RabbitMQ实战:高效部署分布式消息队列」和 「RabbitMQ实战指南」书籍的读书笔记. RabbitMQ 中重要概念 1. 生产者 生产者(producer)创建消息,然后发送到代理 ...

  6. linux进程间通信:system V 信号量 生产者和消费者模型编程案例

    生产者和消费者模型: 有若干个缓冲区,生产者不断向里填数据,消费者不断从中取数据 两者不冲突的前提: 缓冲区有若干个,且是固定大小,生产者和消费者各有若干个 生产者向缓冲区中填数据前需要判断缓冲区是否 ...

  7. Python中的生产者与消费者模式(转载)

    利用多线程和队列可以实现生产者消费者模式.该模式通过平衡生产线程和消费线程的工作能力来提高程序整体处理数据的速度. 1.什么是生产者和消费者? 在线程世界里,生产者就是生产数据(或者说发布任务)的线程 ...

  8. 12.多线程的实现方式、线程安全问题的产生与解决以及生产者与消费者问题

    一.实现多线程 1.1 了解多线程 多线程是指从软件或者硬件上实现多个线程并发执行的技术,具有多线程能力的计算机因有硬件支持而能够在同一时间执行多个线程,从而提升性能. 1.2 并发与并行 并行是指同 ...

  9. java多线程 生产者消费者_java多线程之-生产者与消费者

    java多线程之-并发协作[生产者与消费者]模型 对于多线程程序来说,不管c/c++ java python 等任何编程语言,生产者与消费者模型都是最为经典的.也就是可以说多线程的并发协作 对于此模型 ...

最新文章

  1. Matlab相机标定并进行图像校正
  2. 实验四 使用C++的mfc实现圆心为任意位置的圆的绘制。
  3. mybatis必知必会一
  4. oracle索引自增函数,oracle生成动态前缀且自增号码的函数分享
  5. 18医科大学计算机基础,18春中国医科大学《计算机基础与应用 》在线作业100分答案...
  6. 对象新增方法 object.is() object.assign()
  7. 快速解决Git最常见问题
  8. testng_TestNG超时示例
  9. win10如何做服务器双系统,双系统怎么做?Win7+Win10 双系统安装图文教程
  10. 我所理解的协方差矩阵
  11. [Irving]字符串相似度-字符编辑距离算法(c#实现)
  12. 免费PDF下载网站 Free Pdf Download Engine
  13. Python lambda表达式用法
  14. 计算机技术变化太快,这世界变化太快!Ps修图进入“智能时代”!
  15. SpringBoot2.x 集成 七牛云对象存储Kodo
  16. Python如何删除多余的空格与空行(有代码)
  17. 关于安卓一键分享的,急求帮助!
  18. copy与deepcopy、赋值的区别
  19. 数据访问接口功能及含义
  20. 自制操作系统系列(四):进入64位模式

热门文章

  1. 7-1 验证哥德巴赫猜想
  2. c语言fun的作用,c语言fun函数有什么作用
  3. Qt利用QGraphicsScene编写Word排版工具导出PDF
  4. 手撸的一个快递查询系统,竟然阅读量过1.8w
  5. 关于AC6003、6005、6605版本关联WIFI6代产品方法
  6. C++ operator重载运算符详解
  7. 面试续与如何做自己的职业规划
  8. Calibre for Mac v5.29.0电子书阅读管理工具
  9. 项目研发,有哪些好用的免费脑图工具软件
  10. 第一章 红绿灯数据采集