LinkedBlockingDeque介绍

LinkedBlockingDeque是双向链表实现的阻塞队列。该阻塞队列同时支持FIFO和FILO两种操作方式,即可以从队列的头和尾同时操作(插入/删除);

此外,LinkedBlockingDeque还是可选容量的,防止过度膨胀,默认等于Integer.MAX_VALUE。

LinkedBlockingDeque的uml图

说明:

  1. LinkedBlockingDeque继承于AbstractQueue,它本质上是一个支持FIFO和FILO的双向的队列。
  2. LinkedBlockingDeque实现了BlockingDeque接口,它支持多线程并发。当多线程竞争同一个资源时,某线程获取到该资源之后,其它线程需要阻塞等待。
  3. LinkedBlockingDeque是通过双向链表实现的。
    3.1 first是双向链表的表头。
    3.2 last是双向链表的表尾。
    3.3 count是LinkedBlockingDeque的实际大小,即双向链表中当前节点个数。
    3.4 capacity是LinkedBlockingDeque的容量,它是在创建LinkedBlockingDeque时指定的。
    3.5 lock是控制对LinkedBlockingDeque的互斥锁,当多个线程竞争同时访问LinkedBlockingDeque时,某线程获取到了互斥锁lock,其它线程则需要阻塞等待,直到该线程释放lock,其它线程才有机会获取lock从而获取cpu执行权。
    3.6 notEmpty和notFull分别是“非空条件”和“未满条件”。通过它们能够更加细腻进行并发控制。

LinkedBlockingDeque源码分析

构造方法

public LinkedBlockingDeque(int capacity) {if (capacity <= 0) throw new IllegalArgumentException();this.capacity = capacity;
}

其他成员的初始化:

// “双向队列”的表头
transient Node<E> first;
// “双向队列”的表尾
transient Node<E> last;
// 节点数量
private transient int count;
// 容量
private final int capacity;
// 互斥锁 , 互斥锁对应的“非空条件notEmpty”, 互斥锁对应的“未满条件notFull”
final ReentrantLock lock = new ReentrantLock();
private final Condition notEmpty = lock.newCondition();
private final Condition notFull = lock.newCondition();

添加方法

  public void put(E e) throws InterruptedException {putLast(e);}

putLast方法

  public void putLast(E e) throws InterruptedException {if (e == null) throw new NullPointerException();//构造节点Node<E> node = new Node<E>(e);// 获得锁final ReentrantLock lock = this.lock;lock.lock();try {//如果插入失败,则等待直至插入成功。while (!linkLast(node))notFull.await();} finally {lock.unlock();}}

linkLast方法

private boolean linkLast(Node<E> node) {// 如果“双向链表的节点数量” > “容量”,则返回false,表示插入失败。if (count >= capacity)return false;// 将“node添加到链表末尾”,并设置node为新的尾节点Node<E> l = last;node.prev = l;last = node;if (first == null)first = node;elsel.next = node;// 将“节点数量”+1++count;// 插入节点之后,唤醒notEmpty上的等待线程。notEmpty.signal();return true;
}

如果要删除元素,则调用take方法,take方法跟put方法镜像,方法比较类似,就不展示出来啦。

LinkedBlockingDueue与LinkedBlockingQueue的区别:

LinkedBlockingDueue没有进行读写锁的分离,因此同一时间只能有一个线程对其操作,因此在高并发应用中,它的性能要远远低于LinkedBlockingQueue。

JUC队列-LinkedBlockingDeque(三)相关推荐

  1. Java阻塞队列 LinkedBlockingDeque

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/120833494 本文出自[赵彦军的博客] Java队列 Queue Java队列 ...

  2. 阻塞队列(三):DelayQueue

    阻塞队列(三):DelayQueue DelayQueue是一个支持延时获取元素的无界阻塞队列.里面的元素全部都是"可延期"的元素,列头的元素是最先"到期"的元 ...

  3. Redis 消息队列的三种方案选型

    文章目录 Redis 消息队列的三种方案选型 消息队列(Message Queue,简称 MQ) 消息队列使用场景 Redis 消息队列应用背景,选型思考 Redis消息队列发展历程 在Redis中提 ...

  4. JUC队列-ConcurrentLinkedQueue(四)

    ConcurrentLinkedQueue介绍 ConcurrentLinkedQueue是线程安全的队列,它适用于"高并发"的场景. 它是一个基于链接节点的无界线程安全队列,按照 ...

  5. Redis 消息队列的三种方案(List、Streams、Pub/Sub)

    现如今的互联网应用大都是采用 分布式系统架构 设计的,所以 消息队列 已经逐渐成为企业应用系统 内部通信 的核心手段,它具有 低耦合.可靠投递.广播.流量控制.最终一致性 等一系列功能. 当前使用较多 ...

  6. 【JUC】第三章 多线程锁、CallableFuture 接口

    第三章 多线程锁.Callable&Future 接口 文章目录 第三章 多线程锁.Callable&Future 接口 一.多线程锁 1.synchronized 2.公平锁/非公平 ...

  7. (图解)循环队列的三种判断队空、队满操作(附带源码和插入删除操作等一些基本操作)

    目录 一.普通的顺序存储队列 二.循环队列 (1)少用一个元素空间 i.初始化队列操作: iii.入队操作: iv.出队操作: (2)设置flag标志 i.初始化队列操作: ii.判断队空操作: ii ...

  8. java操作RabbitMQ添加队列、消费队列和三个交换机

    https://www.cnblogs.com/mowen120/p/11905211.html 一.发送消息到队列(生产者) 新建一个maven项目,在pom.xml文件加入以下依赖 01 02 0 ...

  9. JUC队列-LinkedBlockingQueue(二)

    LinkedBlockingQueue介绍 LinkedBlockingQueue是一个以单向链表实现的阻塞队列,链表队列的吞吐量通常高于基于数组的队列,但是在大多数场景中,其可预见的性能要低. 要注 ...

最新文章

  1. CSS中连接属性的排序
  2. mono上运行程序常见问题
  3. ARM7与ARM9的区别
  4. 文件fluent_胡言4种Fluent二次开发姿势
  5. @RequestBody注解失效?从前端传来的数据到底需不需要@RequestBody注解?前端传输数据解析的问题?
  6. JavaScript与TypeScript总结
  7. [NOIP2002] 提高组 洛谷P1031 均分纸牌
  8. spring boot+mybatis整合
  9. C/C++ 交换两个数,不使用第三个变量, 函数模板来实现
  10. spring源码:实例化bean的准备工作
  11. 计算机原理电梯控制系统设计,基于PLC电梯控制系统的设计
  12. Excel将选中的筛选内容复制可见的筛选格中方法
  13. android 图片尺寸修改工具,图片尺寸修改器手机版下载_图片尺寸修改器安卓下载v 6.3...
  14. 通过doi可以检索到文献_什么是DOI?如何获取文献的DOI?
  15. Tensorflow 中 learning rate decay 的奇技淫巧
  16. dw2017不显示动画_10个创建2017年动画视频的最佳工具
  17. 如何有效的避免图片侵权(100%避免网站图片侵权)
  18. 详解旨在提升EVM底层性能的兼容公链Monad
  19. 回归分析(预测模型)
  20. XLSX转换为DOCX,Aspose.Cells快速搞定

热门文章

  1. 网卡MAC地址相关信息大全
  2. TCP的三次握手建立连接和四次握手释放连接
  3. LiveVideoStack公众号内容改版通知
  4. 使用结构化的标头字段改善HTTP
  5. 音视频技术开发周刊 | 135
  6. 【大会】没有什么比把码率降低更爽的了
  7. Intel视频处理与分析技术栈和架构纵览
  8. linux下多种锁的比较
  9. c语言实现c++的继承和多态
  10. webrtc一对一通话