阻塞队列及简单实现,生产者消费者模型

文章目录

  • 阻塞队列
    • 阻塞队列是什么
    • 生产者消费者模型
    • 阻塞队列的实现

阻塞队列

阻塞队列是什么

阻塞队列是一种特殊的队列. 也遵守 “先进先出” 的原则.

  • 当队列满的时候, 继续入队列就会阻塞, 直到有其他线程从队列中取走元素
  • 当队列空的时候, 继续出队列也会阻塞, 直到有其他线程往队列中插入元素

阻塞队列的一个典型应用场景就是 生产者消费者模型. 这是一种非常典型的开发模型.

生产者消费者模型

制作手机有两种方式

  1. 每个工厂包揽制作手机的全部流程, 包括制作组件, 拼接组装, 测试…
  2. 不同工厂负责不同的模块, 一些工厂负责制作组件, 另一些工厂负责组装成手机.

第二种方式就是生产者消费者模型.

制作组件的工厂就是生产者, 组装手机的工厂就是消费者. 放置组件的仓库就是交易场所/阻塞队列(生产者制作组件, 存入; 消费者使用组件, 取出)

这两种方式比较下来, 显然是第二种方式比较高效.

生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合问题.

生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取.

优势:

  1. 阻塞队列也能使生产者和消费者之间解耦.

假如外网向服务器发起了一个充值请求.

在这里插入图片描述

如果B挂了, 会对A产生影响; 如果A挂了, 会对B产生影响; 如果再添加一个服务器C, 就需要对A的代码进行较大的改动.

这样看, A和B之间的耦合就很明显.

如果使用生产者消费者模型, 引入阻塞队列, 就能有效解决上述问题.

在这里插入图片描述

A将请求放在队列中, B直接从队列里取请求, A与B之间没有直接交互, AB之间的耦合度大大减少.

但是响应的效率也会有所降低.

  1. 阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力.

    服务器收到来自客户端的请求数目不是一成不变的, 可能会因一些突发事件引起请求数目暴增.

    这些暴增的请求就能存放在阻塞队列中, 不会导致A, B承受不了大量请求而崩溃.

阻塞队列的实现

class MyBlockingQueue {//加上volatile保证内存可见性//使用一个String类型的数组来保存元素, 假设这里只存Stringprivate volatile String[] items = new String[1000];//指向队列的头部private volatile int head = 0;//指向队列的尾部的下一个元素, 队列中有效数组的元素范围[head, tail)private volatile int tail = 0;//当前的元素个数private volatile int size = 0;/*** 线程安全: 先给put和take进行加锁, 保证在多线程调用的时候能够线程安全*          实现阻塞:*           + 当队列空了或者满了, 就引发阻塞.* @param src* @throws InterruptedException*/public void put(String src) throws InterruptedException {synchronized (this) {//此处的while目的不是为了循环, 而是借助循环的方式, 使线程被唤醒之后, 再次确认一下条件是否成立, 防止线程被唤醒时, 队列还是满着的状态. 此处不能用ifwhile (size >= items.length) {//只要队列满了, 阻塞, 当队列有空间后再被唤醒this.wait();}items[tail] = src;tail++;size++;if(tail >= items.length) {tail = 0;}//size++后, 原本空的队列有元素了, 所以因队列空而阻塞的线程可以被唤醒了this.notify();}}public String take() throws InterruptedException {synchronized (this) {while (size == 0) {//只要队列为空, 阻塞, 当队列中有元素后再被唤醒this.wait();}String elem = items[head];head++;size--;if (head >= items.length) {head = 0;}//size--后, 原本满的队列不满了, 所以因队列满而阻塞的线程可以被唤醒了this.notify();return elem;}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/173921.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

有效实施的五条教学策略

作为老师,是否曾为如何提高教学质量而苦恼?也为如何引导学生而思考?如果你正面临这些困扰,那么这篇文章将对你有帮助。为你介绍五条教学策略,帮你实施教学,提高效果。 明确教学目标 你是否知道你的教学目标…

针对操作系统漏洞的反馈方法

一、针对操作系统漏洞的反馈方法 漏洞扫描指基于漏洞数据库,通过扫描等手段对指定的远程或者本地计算机系统的安全脆弱性进行检测,发现可利用漏洞的一种安全检测(渗透攻击)行为。在进行漏洞扫描后,需先确定哪些是业务…

Go 内置运算符

一、算数运算符 1、算数运算符使用 package mainimport ("fmt" )func main(){fmt.PrintIn("103",103) //10313fmt.PrintIn("10-3",10-3) //10-37fmt.PrintIn("10*3",10*3) //10*330//除法注意:如果运算的数都是…

视频后期效果制作工具Mocha Pro 2022 Plugins mac中文版软件介绍

Mocha Pro 2022 mac是一款专业的三维摄像机反求摩卡跟踪插件,同时也是一款视频后期效果制作工具,Mocha Pro 2022下载能够给数字媒体艺术家提供强大的、直观的和创新的追踪解决方案用简化的界面、加速的工作流程以及轻松追踪和操作镜头的强大性&#xff0…

js moment时间范围拿到中间间隔时间

2023.11.27今天我学习了如何对只返回的开始时间和结束时间做处理,比如后端返回了: [time:{start:202301,end:202310}] 我们需要把中间的间隔渲染出来。 [202301,202302,202303,202304,202305,202306,202307,202308,202309,202310] 利用moment的add进…

Linux下使用Docker部署MinIO存储服务实现远程上传

📑前言 本文主要是Linux下通过Docker部署MinIO存储服务实现远程上传的文章,如果有什么需要改进的地方还请大佬指出⛺️ 🎬作者简介:大家好,我是青衿🥇 ☁️博客首页:CSDN主页放风讲故事 &#…

【AD9371 AD9375 概要总结】A ...

目录 工作原理发射器 TRANSMITTER(Tx)接收器 RECEIVER (Rx)观测接收器 OBSERVATION RECEIVER (ORx)嗅探接收器 SNIFFER RECEIVER(SnRx)时钟输入 CLOCK INPUTSYNTHESIZERS合成RF PLL射…

推动企业数字化转型,如何更好地规避失败风险?

随着科技的飞速发展,数字化转型已成为企业持续发展的必然选择,然而有相关数据显示,超过80%的企业在数字化转型过程中都遭遇失败。本文将揭示企业数字化转型常见的失败原因,并探讨如何帮助企业规避转型失败风险。 一、企业数字化转…

力扣:182. 查找重复的电子邮箱(Python3)

题目: 表: Person ---------------------- | Column Name | Type | ---------------------- | id | int | | email | varchar | ---------------------- id 是该表的主键(具有唯一值的列)。 此表的每一行都包含一封电子…

飞翔的鸟小游戏

第一步是创建项目 项目名自拟 第二步创建个包名 来规范class 再创建一个包 来存储照片package game; import java.awt.*; import javax.swing.*; import javax.imageio.ImageIO; public class Bird { Image image; int x,y; int width,height; int size…

BUUCTF刷题之路--ciscn_2019_es_21

这题考察的是一个栈迁移的知识。作为入门学习栈迁移是个不可多得的好题。程序简单并且是32位的架构。保护也没有开,因此对于理解栈迁移再好不过了。看一下这题的基本信息: 栈迁移的基本原理其实就是栈的空间不够我们利用。也就是不不足以覆盖返回地址&am…

python之yaml技术(可用于写接口自动化的测试用例文件)

一.yaml介绍 yaml文件是一种配置文件类型,相比较ini,conf配置文件来说,更加的简洁,操作也更加简单,同时可以存放不同类型的数据。 yaml使用场景 配置文件 测试用例 二.yaml语法 大小写敏感 使用缩进表示层级关系…

Pytorch深度学习实战2-1:详细推导Xavier参数初始化(附Python实现)

目录 1 参数初始化2 Xavier参数初始化原理2.1 前向传播阶段2.2 反向传播阶段2.3 可视化思考 3 Python实现 1 参数初始化 参数初始化在深度学习中起着重要的作用。在神经网络中,参数初始化是指为模型中的权重和偏置项设置初始值的过程。合适的参数初始化可以帮助模型…

单片机毕设实物买的成品,论文是自己查资料和照着实物写的

单片机毕设实物买的成品,论文是自己查资料和照着实物写的,算学术不端吗? 很多人的想法可能是这样的: 一般来说,毕业论文是独立完成的学术研究,需要表明作者自己的思考和研究成果,应该包括自己的…

Google Shopping Action

Google Shopping Action是Google推出的一项在线购物服务,可以帮助零售商将产品推广和销售到Google平台上的消费者中。通过Google Shopping Action,用户可以在谷歌搜索页面上直接购买商品,而不需要离开搜索结果页面。 Google Shopping Action的…

饺子馆外卖点餐系统小程序效果如何

餐饮行业所涵盖的细分类目非常广,同时又是经济发展的重要支撑,市场规模非常高。饺子是很多人非常喜欢吃的食物,尤其过年的时候,必是少不了几碗饺子,平时也有大量人前往饺子馆。 但相对比火锅、炒菜馆则少些竞争力&…

原创文章生成器-批量原文高质量伪原创

在信息爆炸的时代,创作者们面临的挑战愈发严峻。写一篇原创文章,不仅需要脑洞大开,还得担心自己的文字是否能够迎合读者口味。原创文章生成器只需输入标题或关键词,即可轻松生成原创文章。而与此同时,147SEO改写软件也…

Vatee万腾的数字创新征途:vatee科技力量的独特奇点

在数字化的时代浪潮中,Vatee万腾如一颗耀眼的明星,以其独特的科技奇点引领着数字创新的征途。无论是在人工智能、大数据、云计算,还是智能化领域,Vatee万腾都展现出了与众不同的创新力量,为科技征途描绘了独一无二的奇…

【Springboot系列】SpringBoot整合WebSocket,既然如此简单(含源码)

文章目录 前言:什么是WebSocket?Spring Boot中的WebSocket支持WebSocket和HTTP优劣势WebSocket的优势:1.实时性:2.较低的延迟:3.较小的数据传输量:4.更好的兼容性: HTTP的优势:1.简单…

教师如何高质量备课

备课是教学工作中不可或缺的一部分。高质量的备课不仅可以提高课堂效率,还可以更好地激发学生的学习兴趣和积极性。那么,如何高质量备课呢? 深入了解学生 备课的目的是教授知识,让学生掌握知识。因此,了解学生的需求和…