IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> [Java并发编程-9] 阻塞队列 -> 正文阅读

[数据结构与算法][Java并发编程-9] 阻塞队列

概念和架构

复习数据结构:

  • 队列: 先进先出

  • 栈: 后进先出

阻塞队列:

  • 当队列是空的,从队列中获取元素的操作将会被阻塞, 直到其他线程往空的队列插入新的元素
  • 当队列是满的,从队列中添加元素的操作将会被阻塞, 直到其他线程从队列中移除一个或多个元素或者完全清空,使队列变得空闲起来并后续新增

img

阻塞队列已经被BlockingQueue接口实现, 可以直接调用

实现类及其特性

BlockingQueue接口有很多实现类:

img

  1. ArrayBlockingQueue
    基于数组的阻塞有界阻塞队列
    -ArrayBlockingQueue 在生产者放入数据和消费者获取数据,都是共用同一个锁对象,无法并行

  2. LinkedBlockingQueue
    基于链表的阻塞有界队列(但大小默认值为integer.MAX_VALUE)
    能够高效的处理并发数据,因为其对于生产者端和消费者端分别采用了独立的锁来控制数据同步,这也意味着在高并发的情况下生产者和消费者可以并行地操作队列中的数据,以此来提高整个队列的并发性能

  3. DelayQueue
    使用优先级队列实现的延迟无界阻塞队列
    DelayQueue 中的元素只有当其指定的延迟时间到了,才能够从队列中获取到该元素。DelayQueue 是一个没有大小限制的队列,因此往队列中插入数据的操作(生产者)永远不会被阻塞,而只有获取数据的操作(消费者)才会被阻塞

  4. PriorityBlockingQueue
    基于优先级队列的阻塞队列, 支持优先级排序无界阻塞队列
    没有大小限制, 不会阻塞数据生产者, 而只会在没有可消费的数据时,阻塞数据的消费者

  5. SynchronousQueue
    一种无缓冲的等待队列, 相对于有缓冲的 BlockingQueue 来说,少了一个中间经销商的环节(缓冲区)不存储元素的阻塞队列,也即单个元素的队列

    声明一个 SynchronousQueue 有两种不同的方式: 公平模式和非公平模式, 区别:

    • 公平模式:SynchronousQueue 会采用公平锁,并配合一个 FIFO队列来阻塞多余的生产者和消费者,从而体系整体的公平策略;
    • 非公平模式(SynchronousQueue 默认):SynchronousQueue 采用非公平锁,同时配合一个 LIFO 队列来管理多余的生产者和消费者

    而后一种模式,如果生产者和消费者的处理速度有差距,则很容易出现饥渴的情况,即可能有某些生产者或者是消费者的数据永远都得不到处理

  6. LinkedTransferQueue
    链表结构组成的无界阻塞 TransferQueue 队列

    预占模式: 意思就是消费者线程取元素时,如果队列不为空,则直接取走数据,若队列为空,生成一个节(节点元素为 null)入队,消费者线程被等待在这个节点上,生产者线程入队时发现有一个元素为 null 的节点,生产者线程就不入队了,直接就将元素填充到该节点,并唤醒该节点等待的线程,被唤醒的消费者线程取走元素,从调用的方法返回

  7. LinkedBlockingDeque
    链表结构组成的双向阻塞队列
    阻塞有两种情况:

    • 插入元素时: 如果当前队列已满将会进入阻塞状态,一直等到队列有空的位置时再该元素插入,该操作可以通过设置超时参数,超时后返回 false 表示操作失败,也可以不设置超时参数一直阻塞,中断后抛出 InterruptedException异常
    • 读取元素时: 如果当前队列为空会阻塞住直到队列不为空然后返回元素,同样可以通过设置超时参数

核心方法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DAvpTdF9-1651148710355)(https://docimg6.docs.qq.com/image/XD2kxmjSSmsGqj9e6r1bvA.png?w=1347&h=689/)]

实战训练: 手写一个BlockingQueue的实现类

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-04-30 08:55:25  更:2022-04-30 08:57:31 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 5:53:52-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码