JDK1.8 LinkedBlockingQueue类说明

举报
盼盼 发表于 2021/04/22 15:37:43 2021/04/22
【摘要】 介绍LinkedBlockingQueue是一种基于链表实现的阻塞队列,它实现了BlockingQueue的接口,线程安全。LinkedBlockingQueue初始化时,可以不指定大小,不指定大小默认大小为Integer.MAX_VALUE,属于无界队列。使用时建议初始化一个大小,避免LinkedBlockingQueue元素过大,将系统内存耗光。关于队列的实现原理请参考 队列实现原理和J...

介绍

LinkedBlockingQueue是一种基于链表实现的阻塞队列,它实现了BlockingQueue的接口,线程安全。LinkedBlockingQueue初始化时,可以不指定大小,不指定大小默认大小为Integer.MAX_VALUE,属于无界队列。使用时建议初始化一个大小,避免LinkedBlockingQueue元素过大,将系统内存耗光。

关于队列的实现原理请参考 队列实现原理和JDK1.8 BlockingQueue接口说明,链表原理参考
设计思想

 

在队头出队,在队尾入队,出队和入队分别采用了各自的锁,这样入队和出队可以同时操作,提供队列的吞吐量,提高了效率。实现了生产者与消费者模型。
基本功能解读
节点类(内部类)

    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();

构造函数

默认构造函数

    public LinkedBlockingQueue() {
        this(Integer.MAX_VALUE);
    }

默认队列大小为Integer.MAX_VALUE

需要设置队列大小的构造函数

    public LinkedBlockingQueue(int capacity) {
            if (capacity <= 0) throw new IllegalArgumentException();
            this.capacity = capacity;
            last = head = new Node<E>(null);
        }

集合初始化队列构造函数,队列大小为Integer.MAX_VALUE

    public LinkedBlockingQueue(Collection<? extends E> c) {
            this(Integer.MAX_VALUE);            
            final ReentrantLock putLock = this.putLock;
            putLock.lock(); // Never contended, but necessary for visibility
            try {
                int n = 0;
                for (E e : c) {
                    if (e == null)
                        throw new NullPointerException();
                    if (n == capacity)
                        throw new IllegalStateException("Queue full");
                    enqueue(new Node<E>(e));
                    ++n;
                }
                count.set(n);
            } finally {
                putLock.unlock();
            }
        }


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。