LinkedBlockingQueue是java并发包(JUC)下的一种有界或者是无界的阻塞队列,基于链表实现,适用于生产者消费者模式
特点
- 底层数据结构是单向链表
- 如果指定了容量,队列就是有界的;未指定容量,则是无界的(未指定默认是Integer.MAX_VALUE)
- 入队和出队分别使用不同的锁,用以提高并发能力
- 生产者将任务入队,如果队列已满,则会将任务添加到入队锁(putLock)的条件等待队列(notFull)中
- 消费者消费队列中的任务,如果队列已为空,则会将任务添加到出队锁(takeLock)的条件等待队列(notEmpty)中
底层结构
public class LinkedBlockingQueue<E> extends AbstractQueue<E>
implements BlockingQueue<E>, java.io.Serializable {
/**
* 单向链表节点
*/
static class Node<E> {
E item;
//当前节点的下一个节点
Node<E> next;
Node(E x) { item = x; }
}
//单向链表的容量,不设置默认Integer.MAX_VALUE
private final int capacity;
//链表节点个数
private final AtomicInteger count = new AtomicInteger();
//头节点,没有实际的值,是个空节点
transient Node<E> head;
//尾节点,它没有下一个节点
private transient Node<E> last;
//出队锁
private final ReentrantLock takeLock = new ReentrantLock();
//队列为空时的等待条件对象
private final Condition notEmpty = takeLock.newCondition();
//入队锁
private final ReentrantLock putLock = new ReentrantLock();
//队列已满时的等待条件对象
private final Condition notFull = putLock.newCondition();
}
入队出队队列节点流程图
入队
出队
入队出队流程图
入队
offer(E e)
在队尾添加任务
出队
poll()
在队列头部移出任务