概述
LinkedBlockingDeque是一个由链表结构组成的双向阻塞队列,即可以从队列的两端插入和移除元素。双向队列因为多了一个操作队列的入口,在多线程同时入队时,也就减少了一半的竞争。
相比于其他阻塞队列,LinkedBlockingDeque多了addFirst、addLast、peekFirst、peekLast等方法,以first结尾的方法,表示插入、获取获移除双端队列的第一个元素。以last结尾的方法,表示插入、获取获移除双端队列的最后一个元素。
LinkedBlockingDeque是可选容量的,在初始化时可以设置容量防止其过度膨胀,如果不设置,默认容量大小为Integer.MAX_VALUE。
源码分析
成员变量node
LinkedBlockingDeque的node结构比LinkedBlockingQueue就复杂一点:
static final class Node<E> {
E item;
Node<E> prev;
Node<E> next;
Node(E x) {
item = x;
}
}
一个表示本身的item,一个前驱,一个后继
takeFirst - 阻塞方法
while ( (x = unlinkFirst()) == null) {
notEmpty.await();
}
核心在这一部分,这里取第一个为空时,notEmpty是一个Condition,执行await进入等待状态,等待signal
pollFirst
是一个具有周期性请求能力的阻塞方法
while ((x = unlinkFirst()) == null) {
if (nanos <= 0) {
return null;
}
nanos = notEmpty.awaitNanos(nanos);
}
这里比take多了一个awaitNanos,这里的Condition等待一定时间会自动唤醒,重复while流程
评论区