LinkedBlockingDeque的源码解析(基于JDK1.8)
LinkedBlockingDeque是Java中的一个阻塞双端队列,它继承自AbstractQueue类并实现了BlockingDeque接口。在多线程环境下,LinkedBlockingDeque能够提供高效的并发访问能力。下面我们来看一下它的源码实现。
数据结构
LinkedBlockingDeque是基于链表实现的双向队列。它的每一个节点都包含了一个元素以及指向前后节点的两个指针,它的头节点和尾节点都是空节点(null)。
构造函数
LinkedBlockingDeque提供了三个构造函数:
public LinkedBlockingDeque(): 默认构造函数,创建一个初始容量为Integer.MAX_VALUE的双向队列;
public LinkedBlockingDeque(int capacity): 创建一个指定容量的双向队列;
public LinkedBlockingDeque(Collection<? extends E> c): 创建一个包含指定集合元素的双向队列,元素按照集合迭代器返回的顺序排列。
插入操作
LinkedBlockingDeque提供了以下插入操作,当队列已满时,这些操作会阻塞当前线程,直到队列中有空间可用。
public void addFirst(E e): 将元素插入到队列头部;
public void addLast(E e): 将元素插入到队列尾部;
public boolean offerFirst(E e): 尝试将元素插入到队列头部,如果队列已满则返回false,插入成功则返回true;
public boolean offerLast(E e): 尝试将元素插入到队列尾部,如果队列已满则返回false,插入成功则返回true;
public void putFirst(E e) throws InterruptedException: 将元素插入到队列头部,如果队列已满则阻塞当前线程,直到队列有空间可用;
public void putLast(E e) throws InterruptedException: 将元素插入到队列尾部,如果队列已满则阻塞当前线程,直到队列有空间可用。
移除操作
LinkedBlockingDeque提供了以下移除操作,当队列为空时,这些操作会阻塞当前线程,直到队列中有元素可供移除。
public E removeFirst(): 移除并返回队列头部的元素,如果队列为空则抛出NoSuchElementException异常;
public E removeLast(): 移除并返回队列尾部的元素,如果队列为空则抛出NoSuchElementException异常;
public E pollFirst(): 移除并返回队列头部的元素,如果队列为空则返回null;
public E pollLast(): 移除并返回队列尾部的元素,如果队列为空则返回null;
public E takeFirst() throws InterruptedException: 移除并返回队列头部的元素,如果队列为空则阻塞当前线程,直到队列中有元素可供移除;
public E takeLast() throws InterruptedException: 移除并返回队列尾部的元素,如果队列为空则阻塞当前线程,直到队列中有元素可供移除。
检索操作
LinkedBlockingDeque提供了以下检索操作,当队列为空时,这些操作会阻塞当前线程,直到队列中有元素可供检索。
public E getFirst(): 返回队列头部的元素,如果队列为空则抛出NoSuchElementException异常;
public E getLast(): 返回队列尾部的元素,如果队列为空则抛出NoSuchElementException异常;
public E peekFirst(): 返回队列头部的元素,如果队列为空则返回null;
public E peekLast(): 返回队列尾部的元素,如果队列为空则返回null。
其它操作
LinkedBlockingDeque还提供了以下其它操作:
public int size(): 返回队列中元素的数量;
public int remainingCapacity(): 返回队列中剩余空间的数量;
public boolean removeFirstOccurrence(Object o): 移除队列中第一个等于指定元素的元素,如果移除成功则返回true,否则返回false;
public boolean removeLastOccurrence(Object o): 移除队列中最后一个等于指定元素的元素,如果移除成功则返回true,否则返回false;
public Object[] toArray(): 返回包含队列所有元素的数组,元素按照从头到尾的顺序排列;
public <T> T[] toArray(T[] a): 返回包含队列所有元素的数组,元素按照从头到尾的顺序排列,如果指定数组a的长度不足以容纳队列中所有元素,则会创建一个新数组并返回。
总结
LinkedBlockingDeque是一个高效的双向队列,能够提供高并发的访问能力。我们可以通过它提供的各种插入、移除、检索和其它操作来满足不同的业务需求。