LinkedBlockingQueue是基于单链表实现的有界阻塞队列,它不允许值为null。
存储结构
- 单链表
1 | static class Node<E> { |
- 头尾结点
注意头结点head和尾结点last的不同之处:
1.head是一个辅助头结点,它的值为null,即head.item == null;
2.last是一个真实的尾结点,它的后继为null,即last.next == null。
1 | /** |
锁
1 | /** Lock held by take, poll, etc */ |
构造方法
1 | // 默认的容量为2^31 - 1 |
入队操作
put方法
1 | public void put(E e) throws InterruptedException { |
实际的进队操作由enqueue方法完成
1 | private void enqueue(Node<E> node) { |
enqueue方法采用了链式赋值,如果对Java链式赋值的顺序不太了解,可能会看不懂。它可以分解成以下两步:
1 | last.next = node; |
如果执行入队操作前,队列是空的,那么等到成功执行入队操作后,通知一个等待执行出队操作的线程。
1 | // 通知某个线程:队列不为空,可以执行出队操作 |
offer方法
1 | public boolean offer(E e) { |
出队操作
take方法
1 | // 出队,并返回队首元素 |
实际的出队操作由dequeue方法实现
1 | private E dequeue() { |
如果执行出队操作前,队列已经满了,那么等到成功执行出队操作后,通知一个等待执行入队操作的线程。
1 | // 通知某个线程:队列不满,可以执行入队操作 |
poll方法
1 | public E poll() { |
取队首元素
1 | public E peek() { |