并发编程之队列详解

LinkedBlockingDeque是一个由链表结构组成的双向阻塞队列,即可以从队列的两端插入和移除元素。双向队列因为多了一个操作队列的入口,在多线程同时入队时,也就减少了一半的竞争。

相比于其他阻塞队列,LinkedBlockingDeque多了addFirst、addLast、peekFirst、peekLast等方法,以first结尾的方法,表示插入、获取获移除双端队列的第一个元素。以last结尾的方法,表示插入、获取获移除双端队列的最后一个元素。

LinkedBlockingDeque是可选容量的,在初始化时可以设置容量防止其过度膨胀,如果不设置,默认容量大小为Integer.MAX_VALUE。

该类继承自AbstractQueue抽象类,又实现了BlockingDeque接口,下面介绍一个BlockingDeque接口,该接口定义如下:

public class LinkedBlockingDeque<E> extends AbstractQueue<E> implements BlockingDeque<E>, java.io.Serializable;

该类继承自AbstractQueue抽象类,又实现了BlockingDeque接口,下面介绍一个BlockingDeque接口,该接口定义如下:

public interface BlockingDeque<E> extends BlockingQueue<E>, Deque<E>

BlockingDeque继承自BlockingQueue和Deque接口,BlockingDeque接口定义了在双端队列中常用的方法。

LinkedBlockingDeque类的底层实现和LinkedBlockingQueue类很相似,都有一个全局独占锁,和两个Condition对象,用来阻塞和唤醒线程。

LinkedBlockingDeque类对元素的操作方法比较多,我们下面以putFirst、putLast、pollFirst、pollLast方法来对元素的入队、出队操作进行分析。

其实LinkedBlockingDeque类的入队、出队操作都是通过linkFirst、linkLast、unlinkFirst、unlinkLast这几个方法来实现的,源码读起来也比较简单。

putFirst(E e)方法是将指定的元素插入双端队列的开头。

入队操作是通过linkFirst(E e)方法来完成的。

若入队成功,则linkFirst(E e)方法返回true,否则,返回false。若该方法返回false,则当前线程会阻塞在notFull条件上。

putLast(E e)方法是将指定的元素插入到双端队列的末尾。

该方法和putFirst(E e)方法几乎一样,不同点在于,putLast(E e)方法通过调用linkLast(E e)方法来插入节点。

若入队成功,则linkLast(E e)方法返回true,否则,返回false。若该方法返回false,则当前线程会阻塞在notFull条件上。

出队

pollFirst()方法是获取并移除此双端队列的首节点,若不存在,则返回null,源码如下.

移除首节点的操作是通过unlinkFirst()方法来完成的:

pollLast()方法是获取并移除此双端队列的尾节点,若不存在,则返回null,源码如下。

移除尾节点的操作是通过unlinkLast()方法来完成的

这些就是基本的方法解释。

猜你喜欢

转载自blog.csdn.net/yiyongjiajun521/article/details/81869156
今日推荐