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

news2025/2/21 17:59:54

文章目录

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

阻塞队列

阻塞队列是什么

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

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

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

生产者消费者模型

制作手机有两种方式

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

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

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

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

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

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

优势:

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

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

在这里插入图片描述

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

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

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

在这里插入图片描述

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

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

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

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

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

阻塞队列的实现

class MyBlockingQueue {

    //加上volatile保证内存可见性

    //使用一个String类型的数组来保存元素, 假设这里只存String
    private 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目的不是为了循环, 而是借助循环的方式, 使线程被唤醒之后, 再次确认一下条件是否成立, 防止线程被唤醒时, 队列还是满着的状态. 此处不能用if
            while (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.coloradmin.cn/o/1258422.html

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

相关文章

B 树和 B+树 的区别

文章目录 B 树和 B树 的区别 B 树和 B树 的区别 了解二叉树、AVL 树、B 树的概念 B 树和 B树的应用场景 B 树是一种多路平衡查找树,为了更形象的理解。 二叉树,每个节点支持两个分支的树结构,相比于单向链表,多了一个分支。 …

边缘计算网关:智能制造的“智慧大脑”

一、智能制造的崛起 随着科技的飞速发展,智能制造已经成为了制造业的新趋势。智能制造不仅能够提高生产效率,降低生产成本,还能够实现个性化定制,满足消费者多样化的需求。然而,智能制造的实现离不开大量的数据处理和分…

警惕!AI正在“吞食”你的数据

视觉中国供图 □ 科普时报记者 陈 杰 AI大模型的热度,已然开始从产业向日常生活渗透,并引起不小的舆论旋涡。近日,网友指出国内某智能办软件有拿用户数据“投喂”AI之嫌,引发口水的同时,再度把公众对AI的关注转移到数…

AWR294x收发器的干扰抑制(TI文档)

摘要: AWR294x收发器是一种集成的片上雷达设备,不仅具有RF,模拟和ADC电路,而且在芯片上还有许多处理器核。它有一个专门的雷达信号处理加速器(称为硬件加速器或HWA),具有能够探测和减缓雷达-雷达干扰的特点。本文档介绍…

MySQL死锁,死锁产生的4个必要条件,死锁案例, 如何避免死锁

文章目录 MySQL死锁了怎么办(死锁的产生及解决方案)?1、 死锁与产生死锁的四个必要条件1.1 什么是死锁1.2 死锁产生的4个必要条件 2、死锁案例2.1 表锁死锁2.2 行锁死锁2.3 共享锁转换为排他锁 3、死锁排查4、 如何避免死锁5、死锁的排查6、 …

抖音餐饮门店点餐外卖小程序作用是什么

餐饮从业商家、各种餐品饮料线下门店众多,随着线上订餐、团购、预约、点餐等方式发展,线下门店经营痛点明显,不少商家选择搭建餐饮门店小程序一方面是品牌传播拓客及提升服务效率,另一方面则是赋能客户完善消费及覆盖进店前后路径…

教师如何高质量备课

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

使用脚手架创建Vue3项目

✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Leo的博客 💞当前专栏: Vue ✨特色专栏: MySQL学习…

【MySQL | TCP】宝塔面板结合内网穿透实现公网远程访问

文章目录 前言1.Mysql服务安装2.创建数据库3.安装cpolar3.2 创建HTTP隧道4.远程连接5.固定TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网TCP端口地址 前言 宝塔面板的简易操作性,使得运维难度降低,简化了Linux命令行进行繁琐的配置&#x…

多头注意力机制基本概念

文章目录 基本概念模型小结 基本概念 我们可以用独立学习得到的h组不同的 线性投影来变换查询、键和值。 然后,这h组变换后的查询、键和值将并行地送到注意力汇聚中。 最后,将这h个注意力汇聚的输出拼接在一起, 并且通过另一个可以学习的线性…

外汇天眼:嘿!他们说这个比赛有手就能赢,你敢不敢来试试?

在外汇市场的波涛汹涌中,一场引人注目的模拟交易比赛正在悄然展开,参与者们纷纷聚焦,听所有获奖的参赛投资者们说:这个比赛有手就能赢,你敢不敢来试试? 比赛规则简单而富有挑战性。你只需在外汇天眼APP开通…

【虹科干货】什么是软件成分分析(SCA)?

大家或许都发现了,开发人员愈发依赖开源代码来快速为其专有软件添加功能。据估计,开源代码占专有应用程序代码库的 60-80%。相伴而来的,除了更高的效率,还有更高的风险。因此,管理开源代码对于降低组织的安全风险至关重…

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

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

盛元广通实验室安全培训考试系统

盛元广通实验室安全培训考试系统是一种基于互联网和人工智能技术的在线考试平台,旨在旨在提供实验室安全教育和考核的全面解决方案。该系统可以帮助实现实验室安全培训考试的在线化、智能化和规范化,提高实验室安全意识和能力,保障实验室安全…

百度人工智能培训第二天笔记

参加了百度人工智能初步培训,主要是了解一下现在人工智能的基本情况,以便后续看可以参与一些啥? 下面就继续前一天的内容记录。 一、先做电动自行车的电梯里检测 先进行图片资料的上传与标注,这个昨天的最好也说了一下。 训练完后…

马斯克发布一封指控 Sam Altman 的匿名信引发猜测,OpenAI “宫斗大戏”终迎结局?

就在昨晚,持续了数日的 OpenAI 宫斗大戏,似乎终于要大结局了——OpenAI 官宣:Sam Altman 将回归 OpenAI,重新担任 CEO! “我们已达成原则性协议,Sam Altman 将重返 OpenAI 担任 CEO,新的初始董…

Temu要求提交RSL Report 铅镉或RSL-Phthalate邻苯报告如何办理

Temu要求提交RSL Report 铅镉或RSL-Phthalate邻苯报告如何办理 Temu要求提交RSL Report 铅镉或RSL-Phthalate邻苯报告如何办理 RSL Report是欧盟REACH法规要求的一种资质报告,旨在确保产品不含对人体有害的化学物质。在珠宝首饰行业中,RSL Report认证是…

(京东大数据分析)10月运动鞋服消费数据采集:服饰销量同比增长20%

10月份,在双11大促节的加持下,消费市场中不少品类的销售成绩均呈现增长。鲸参谋发现,运动鞋服消费类目也受到了市场及消费者的特别青睐,消费数据也有了明显增长,下面我们来看一看运动鞋服市场在10月的销售详情。 首先来…

成为一名优秀教师的关键要素

在教育领域,要想成为一名优秀的教师可是需要多方面的素质和技能的。以下是我总结出的几点关键要素,供大家参考。 热爱教育事业 首先对教育事业充满热爱和热情。只有对事业有强烈的兴趣和热爱,才能在漫长的工作中保持耐心、专注和投入。热爱教…