浪子归家|Java并发编程-LinkedBlockingDeque详解
简介LinkedBlockingDeque是一个由链表结构组成的双向阻塞队列 , 即可以从队列的两端插入和移除元素 。 双向队列因为多了一个操作队列的入口 , 在多线程同时入队时 , 也就减少了一半的竞争 。
相比于其他阻塞队列 , LinkedBlockingDeque多了addFirst、addLast、peekFirst、peekLast等方法 , 以first结尾的方法 , 表示插入、获取或移除双端队列的第一个元素 。 以last结尾的方法 , 表示插入、获取或移除双端队列的最后一个元素 。
LinkedBlockingDeque是可选容量的 , 在初始化时可以设置容量防止其过度膨胀 , 如果不设置 , 默认容量大小为Integer.MAX_VALUE 。
LinkedBlockingDeque类有三个构造方法:
public LinkedBlockingDeque()public LinkedBlockingDeque(int capacity)public LinkedBlockingDeque(Collection extends E> c)LinkedBlockingDeque源码详解LinkedBlockingDeque类定义为:
public class LinkedBlockingDeque该类继承自AbstractQueue抽象类 , 又实现了BlockingDeque接口 , 下面介绍一个BlockingDeque接口 , 该接口定义如下:
public interface BlockingDequeBlockingDeque继承自BlockingQueue和Deque接口 , BlockingDeque接口定义了在双端队列中常用的方法 。
LinkedBlockingDeque类中的数据都被封装成了Node对象:
static final class NodeLinkedBlockingDeque类中的重要字段如下:
// 队列双向链表首节点transient NodeLinkedBlockingDeque类的底层实现和LinkedBlockingQueue类很相似 , 都有一个全局独占锁 , 和两个Condition对象 , 用来阻塞和唤醒线程 。
LinkedBlockingDeque类对元素的操作方法比较多 , 我们下面以putFirst、putLast、pollFirst、pollLast方法来对元素的入队、出队操作进行分析 。
入队putFirst(E e)方法是将指定的元素插入双端队列的开头 , 源码如下:
public void putFirst(E e) throws InterruptedException {// 若插入元素为null , 则直接抛出NullPointerException异常if (e == null) throw new NullPointerException();// 将插入节点包装为Node节点Node入队操作是通过linkFirst(E e)方法来完成的 , 如下所示:
private boolean linkFirst(Node若入队成功 , 则linkFirst(E e)方法返回true , 否则 , 返回false 。 若该方法返回false , 则当前线程会阻塞在notFull条件上 。
推荐阅读
- 逍遥浪子龙|汽车“栽进窗”,太危险!女子停车忘拉手刹
- Java|淘宝商家要小心了!取消的“中差评”体系又回来啦!
- javascript|游戏开发之旅-JavaScript重新介绍
- Java|java多线程并发小demo
- Java|java程序猿如何才能走远,怎么做自己的职业规划
- [婚外情]我结婚了但爱上了别人,心存愧疚,我想回归家庭该怎么做
- 蚂蚁花呗|血亏!阿里P8轻易把总结了近一年的java高级特性笔记送人了
- 百度|Java高级进阶多线程学习之路(七)ThreadLocal
- 足坛最前线|却被国米球迷永远拉黑,布尔迪索:潘帕斯浪子中后卫
- 土土女排|进攻实力将大幅提升,回归家乡!女排世界冠军有望加盟辽宁
