LinkedBlockingQueue源码分析

本文对比分析了LinkedBlockingQueue和ArrayBlockingQueue,着重讲解了它们在初始化、锁实现、操作性能上的区别。LinkedBlockingQueue允许不指定初始容量,默认为Integer.MAX_VALUE,而ArrayBlockingQueue初始化必须指定大小。在元素操作上,LinkedBlockingQueue需要将元素转化为Node,可能影响性能。
摘要由CSDN通过智能技术生成

在很久前我们分析了ArrayBlockingQueue,今天我们来分析分析LinkedBlockingQueue.
看看他们之间有什么区别,在什么时候我们用什么那个阻塞队列。
我们先来看看LinkedBlockingQueue的一些属性。

定义了一个内部类,相当于一个结点,用来对元素进行操作的结构。
static class Node<E> {
   
        E item;

        /**
         * One of:
         * - the real successor Node
         * - this Node, meaning the successor is head.next
         * - null, meaning there is no successor (this is the last node)
         */
        Node<E> next;

        Node(E x) { item = x; }
    }

LinkedBlockingQueue的属性

    队列的大小,可以容纳元素的数量
    private final int capacity;

    当前的队列中的元素的个数,用的是原子锁操作,保证内存的可见性,采用的是cas算法,作为数据的保证,这个我也不懂,下次我们看源码一起分析。
    private final AtomicInteger count = new AtomicInteger();
    头结点
    transient Node<E> head;
    尾结点
    private transient Node<E> last;
    取元素的单独一把锁,这里就跟ArrayBlockingQueue有区别了,ArrayBlockingQueue是添加和取元素都是同一把锁,不能并行的操作。
    private final ReentrantLock takeLock = new ReentrantLock();
    队列不为空的信号
    private fin
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值