在很久前我们分析了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