Java并发体系--LinkedBlockingDeque

LinkedBlockingDeque  

     LinkedBlockingDeque是Java中的一个双向链表阻塞队列,实现了BlockingDeque接口。它是一个线程安全的队列数据结构,可以同时支持在队列的头部和尾部进行元素的添加和删除操作,并且在队列为空或已满时提供阻塞操作。

    LinkedBlockingDeque内部使用双向链表作为数据存储结构,在插入或删除元素时可以快速地定位到头部和尾部。与LinkedList相比,LinkedBlockingDeque提供了更好的并发性能,因为它使用了锁分离技术,允许多个线程同时进行插入和删除操作。

    LinkedBlockingDeque支持阻塞操作,当队列为空时,获取元素的操作会被阻塞,直到队列中有新的元素被添加;当队列已满时,添加元素的操作会被阻塞,直到队列中的元素被删除。通过阻塞操作,LinkedBlockingDeque可以用于实现生产者-消费者模式,其中生产者线程向队列中添加元素,而消费者线程从队列中获取元素。

    LinkedBlockingDeque的容量可以是无限的,也可以通过构造函数指定一个固定的容量。如果容量被限制,当队列满时,生产者线程也会被阻塞,直到队列中的元素被消费。

常用方法

      LinkedBlockingDeque是Java中的一个双向阻塞队列,它实现了Deque接口。它的内部使用链表实现,可以在队列的两端进行插入和删除操作。下面是LinkedBlockingDeque常用的方法:

  1. addFirst(E e): 在队列的头部插入一个元素。
  2. addLast(E e): 在队列的尾部插入一个元素。
  3. offerFirst(E e): 在队列的头部插入一个元素,如果插入成功返回true,如果队列已满返回false。
  4. offerLast(E e): 在队列的尾部插入一个元素,如果插入成功返回true,如果队列已满返回false。
  5. removeFirst(): 移除并返回队列的头部元素。
  6. removeLast(): 移除并返回队列的尾部元素。
  7. pollFirst(): 移除并返回队列的头部元素,如果队列为空返回null。
  8. pollLast(): 移除并返回队列的尾部元素,如果队列为空返回null。
  9. getFirst(): 返回队列的头部元素,但不移除。
  10. getLast(): 返回队列的尾部元素,但不移除。
  11. peekFirst(): 返回队列的头部元素,如果队列为空返回null。
  12. peekLast(): 返回队列的尾部元素,如果队列为空返回null。
  13. putFirst(E e): 在队列的头部插入一个元素,如果队列已满,则等待空间可用。
  14. putLast(E e): 在队列的尾部插入一个元素,如果队列已满,则等待空间可用。
  15. takeFirst(): 移除并返回队列的头部元素,如果队列为空,则等待元素可用。
  16. takeLast(): 移除并返回队列的尾部元素,如果队列为空,则等待元素可用。
  17. size(): 返回队列中的元素数量。

  除了上述方法,LinkedBlockingDeque还继承了Deque接口中的其他方法,如isEmpty()、contains()、iterator()等。

实现

、  

LinkedBlockingDeque是Java中的一个双端队列(Deque)的实现类,它基于链表实现,可以在队列的两端进行插入和删除操作。它是一个线程安全的类,可以被多个线程同时访问和操作。

LinkedBlockingDeque内部维护了一个双向链表,每个节点包含了一个元素和对前后节点的引用。队列的头部和尾部分别有指针指向第一个和最后一个节点。

LinkedBlockingDeque的特点是可以实现阻塞操作,即当队列为空时,从队列中获取元素的操作会被阻塞,直到队列中有元素可获取。同样,当队列满时,向队列中添加元素的操作也会被阻塞,直到队列有空闲位置可用。

LinkedBlockingDeque的构造方法有以下几种:

  • LinkedBlockingDeque():创建一个默认初始容量的LinkedBlockingDeque。
  • LinkedBlockingDeque(int capacity):创建一个指定初始容量的LinkedBlockingDeque。
  • LinkedBlockingDeque(Collection<? extends E> c):创建一个包含指定集合元素的LinkedBlockingDeque,元素按照集合的迭代器顺序排列。

LinkedBlockingDeque是一个具有良好并发性能的双端队列实现,它常被用于实现工作者线程的任务队列,也可以用于实现生产者-消费者模式。

实例

     LinkedBlockingDeque是Java中的一个双向阻塞队列,它实现了BlockingDeque接口。它可以在两个方向上插入和删除元素,并且可以阻塞线程,直到队列满或者为空。

下面是一个使用LinkedBlockingDeque的代码示例:

import java.util.concurrent.LinkedBlockingDeque;public class LinkedBlockingDequeExample {public static void main(String[] args) {LinkedBlockingDeque<Integer> deque = new LinkedBlockingDeque<>(3);// 向队列的头部插入元素deque.addFirst(1);deque.addFirst(2);deque.addFirst(3);// 向队列的尾部插入元素deque.addLast(4);// 从队列的头部删除元素System.out.println(deque.removeFirst());System.out.println(deque.removeFirst());// 从队列的尾部删除元素System.out.println(deque.removeLast());}
}

    上述代码创建了一个容量为3的LinkedBlockingDeque对象,然后向队列的头部插入了元素1、2、3,再向队列的尾部插入元素4。接着从队列的头部依次删除元素1、2,最后从队列的尾部删除元素4。

   LinkedBlockingDeque的主要特点是可以在两个方向上插入和删除元素,以及在队列满或者为空时阻塞线程。例如,如果队列已满,线程尝试插入元素时会被阻塞,直到队列有空闲位置。同样,如果队列为空,线程尝试删除元素时也会被阻塞,直到队列中有元素可供删除。

总结 

     LinkedBlockingDeque是一个线程安全的双端队列,它是基于链表的数据结构实现的。它继承自AbstractQueue类并实现了BlockingDeque接口。

    LinkedBlockingDeque的特点有:

  1. 双端队列:它可以在队列的两端进行元素的插入和删除操作。

  2. 容量可选:LinkedBlockingDeque可以选择有限容量或无限容量。如果指定了容量,那么在插入元素时,如果队列已满,插入操作将会阻塞,直到有空间可用。如果没有指定容量,那么队列的容量将是无限的。

  3. 链表实现:LinkedBlockingDeque以链表的形式存储元素,这样可以实现高效的插入和删除操作。它不会像数组实现的队列一样存在元素的搬移操作。

  4. 线程安全:LinkedBlockingDeque是线程安全的,它使用了锁和条件变量来实现线程之间的同步。

  5. 阻塞操作:LinkedBlockingDeque提供了一些阻塞操作,如put、take等方法。当队列为空时,调用take方法将会阻塞,直到队列中有元素可取出。当队列满时,调用put方法将会阻塞,直到队列中有空间可插入。

  6. 并发性能:LinkedBlockingDeque支持多个线程同时执行插入和删除操作,它通过使用不同的锁来实现细粒度的并发控制,从而提高了并发性能。

 

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

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

相关文章

【刷题笔记】第八天

文章目录 [928. 尽量减少恶意软件的传播 II](https://leetcode.cn/problems/minimize-malware-spread-ii/)方法1&#xff1a;dfs方法2&#xff1a;并查集 [GCD and LCM](https://vjudge.net.cn/problem/Aizu-0005)[Missing Bigram](https://vjudge.net.cn/problem/CodeForces-1…

基于springboot+vue+Mysql的简历系统

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

数据赋能(60)——要求:数据服务部门能力

“要求&#xff1a;数据服务部门实施数据赋能影响因素”是作为标准的参考内容编写的。 在实施数据赋能中&#xff0c;数据服务部门的能力体现在多个方面&#xff0c;关键能力如下图所示。 在实施数据赋能的过程中&#xff0c;数据服务部门应具备的关键能力如下。 业务理解和沟…

案例与脚本实践:DolphinDB 轻量级实时数仓的构建与应用

DolphinDB 高性能分布式时序数据库&#xff0c;具有分布式计算、事务支持、多模存储、以及流批一体等能力&#xff0c;非常适合作为一款理想的轻量级大数据平台&#xff0c;轻松搭建一站式的高性能实时数据仓库。 本教程将以案例与脚本的方式&#xff0c;介绍如何通过 Dolphin…

MySQL 的事务

事务概念 MySQL事务是一个或者多个的数据库操作&#xff0c;要么全部执行成功&#xff0c;要么全部失败回滚。 事务是通过事务日志来实现的&#xff0c;事务日志包括&#xff1a;redo log和undo log。 事务状态 事务有以下五种状态&#xff1a; 活动的部分提交的失败的中止的…

使用GAN做图像超分——SRGAN,ESRGAN

在GAN出现之前&#xff0c;使用的更多是MSE&#xff0c;PSNR,SSIM来衡量图像相似度&#xff0c;同时也使用他们作为损失函数。 但是这些引以为傲的指标&#xff0c;有时候也不是那么靠谱&#xff1a; MSE对于大的误差更敏感&#xff0c;所以结果就是会倾向于收敛到期望附近&am…

【深度学习】wandb模型训练可视化工具使用方法

【深度学习】wandb模型训练可视化工具使用方法 wandb简介功能介绍登陆注册以及API keysproject和runsproject和runs的关系 wandb的配置实验跟踪版本管理Case可视化分析可视化自动调参&#xff08;wandb.sweep&#xff09;配置wandb.sweep1.配置 sweep_config2.初始化 sweep con…

【python】flask中ORM工具SQLAIchemy,各种数据查询操作详细解析

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

Python 密码学实用指南(全)

原文&#xff1a;zh.annas-archive.org/md5/fe5e9f4d664790ea92fb33d78ca9108d 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 前言 密码学在保护关键系统和敏感信息方面有着悠久而重要的历史。本书将向您展示如何使用 Python 加密、评估、比较和攻击数据。总的来说&…

Qt对话框

文章目录 创建普通的对话框对话框的内存泄露问题自定义对话框模态式对话框QMessageBox&#xff08;消息对话框&#xff09;对话框类型对话框按钮接收对话框返回值演示其他创建方式 QColorDialog&#xff08;颜色对话框&#xff09;案例 QFileDialog&#xff08;文件对话框&…

仿真测试的应用领域

仿真测试在各种领域中都有广泛的应用&#xff0c;以下是一些应用最广泛的场景&#xff1a; 工业制造&#xff1a;通过模拟制造过程&#xff0c;可以预测产品的质量和性能&#xff0c;优化生产流程&#xff0c;降低成本。航空航天&#xff1a;飞机、导弹、航天器等的设计和研发…

Python - 字符串的应用

字符串格式化问题 使用规则举例: name input("请输入你的名字&#xff1a;") address input("请输入你的住址&#xff1a;") age int(input("请输入你的年龄&#xff1a;")) hobby input("请输入你的爱好&#xff1a;") # %s 字符…

【Android GUI】从总体上了解Android的GUI体系

文章目录 概览Android硬件接口HALGralloc与Framebuffer Gralloc模块的加载Gralloc提供的接口Android原生的Gralloc实现打开framebuffer设备打开gralloc设备 参考 概览 Linux内核提供了统一的framebuffer显示驱动。设备节点/dev/graphics/fb*或者/dev/fb*&#xff0c;其中fb0表示…

快速上手Linux核心命令

Linux 的重要性不用我多说了吧&#xff0c;大多数互联网公司&#xff0c;服务器都是采用的Linux操作系统 Linux是一个主要通过命令行来进行管理的操作系统。 只有熟练掌握Linux核心命令&#xff0c;在使用起来我们才会得心应手 这里给大家整理了Linux一些核心命令&#xff0…

Android --- Activity

官方文档-activity Activity 提供窗口&#xff0c;供应在其中多个界面。此窗口通常会填满屏幕&#xff0c;但也可能小于屏幕并浮动在其他窗口之上。 大多数应用包含多个屏幕&#xff0c;这意味着它们包含多个 Activity。通常&#xff0c;应用中的一个 Activity 会被指定主 Ac…

JAVA基础08- 继承,重写,super以及this

目录 继承&#xff08;extends&#xff09; 定义 说明 作用 方法的重写 定义 重写关键点 方法重写与重载的区别 练习 练习1&#xff08;方法继承与重写的简单练习&#xff09; 练习2&#xff08;方法继承与重写的进阶练习&#xff09; This的使用 定义 作用以及注…

基于SpringBoot+Vue的IT技术交流平台(源码+文档+包运行)

一.系统概述 我国科学技术的不断发展&#xff0c;计算机的应用日渐成熟&#xff0c;其强大的功能给人们留下深刻的印象&#xff0c;它已经应用到了人类社会的各个层次的领域&#xff0c;发挥着重要的不可替换的作用。信息管理作为计算机应用的一部分&#xff0c;使用计算机进行…

leetcode-分割链表

题目 面试题 02.04. 分割链表 提示 给你一个链表的头节点 head 和一个特定值 x &#xff0c;请你对链表进行分隔&#xff0c;使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。 你不需要 保留 每个分区中各节点的初始相对位置。 示例 1&#xff1a; 输入&#xff…

搜维尔科技:【工业仿真】煤矿安全知识基础学习VR系统

产品概述 煤矿安全知识基础学习VR系统 系统内容&#xff1a; 煤矿安全知识基础学习VR系统内容包括&#xff1a;下井流程&#xff08;正确乘坐罐笼、班前会、井下行走注意事项、工作服穿戴、入井检身及人员清点、下井前准备工作、提升运输安全&#xff09;&#xff1b;运煤流程…

SpringBoot集成RockerMQ

1.引入依赖 <dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-spring-boot-starter</artifactId><version>2.2.0</version> </dependency>2.配置服务器地址 #Rocketmq配置 rocketmq.name-server192…