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是一个高效的双向队列,能够提供高并发的访问能力。我们可以通过它提供的各种插入、移除、检索和其它操作来满足不同的业务需求。