Java中的LinkedBlockingQueue

LinkedBlockingQueue是java并发包(JUC)下的一种有界或者是无界的阻塞队列,基于链表实现,适用于生产者消费者模式

特点

  1. 底层数据结构是单向链表
  2. 如果指定了容量,队列就是有界的;未指定容量,则是无界的(未指定默认是Integer.MAX_VALUE)
  3. 入队和出队分别使用不同的锁,用以提高并发能力
  4. 生产者将任务入队,如果队列已满,则会将任务添加到入队锁(putLock)的条件等待队列(notFull)中
  5. 消费者消费队列中的任务,如果队列已为空,则会将任务添加到出队锁(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()

在队列头部移出任务

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值