文章目录
LinkedBlockingDeque 是基于链表实现的双端阻塞队列,我们可以从队列的头部和尾部插入或者读取元素。
LinkedBlockingDeque 和 ArrayBlockingQueue 都是使用一把锁保证线程安全。
LinkedBlockingDeque 和 LinkedBlockingQueue 相比,增加了在头尾的插入和删除,但是用的是一把锁。因为 LinkedBlockingDeque 默认 head 和 last 都是 null,且首位均可进行插入和删除,所以不像 LinkedBlockingQueue,可以通过一个 Count 和哨兵结点 head 实现 take 和 put 两把锁。
用法介绍
import java.util.concurrent.LinkedBlockingDeque;
public class TestQueue {
public static void main(String[] args) throws InterruptedException {
LinkedBlockingDeque<Integer> deque = new LinkedBlockingDeque<>(8);
deque.putFirst(1);
deque.getFirst();
deque.putLast(2);
deque.getLast();
}
}
核心属性
static final class Node<E> {
E item;
Node<E> prev;
Node<E> next;
Node(E x) {
item = x;
}
}
// 链表头结点
transient Node<E> first;
// 链表尾结点
transient Node<E> last;
// 队列中元素的个数
private transient int count;
// 队列最大容量
private final int capacity;
// 全局锁
final ReentrantLock lock = new ReentrantLock();
// 用于等待队列为非空的条件变量(take 时队列空了,就要等到队列为非空时再进行 take)
private final Condition notEmpty = lock.newCondition();
// 用于等待队列为非满的条件变量(put 时队列满了,就要等到队列为非满时再进行 put)
private final Condition notFull = lock.newCondition();