[java队列]——LinkedBlockingQueue
回顾ArrayBlockingQueue
之前介绍过[java队列]——ArrayBlockingQueue,这里先回顾一下ArrayBlockingQueue的特点:
- 数组实现
- 线程安全,利用可重入锁控制非空和非满两个Condition进行并发控制
- 不需要扩容,数组大小固定,利用循环数组
缺点: - 队列长度在初始化时指定,并且不会自动扩容,选择容量时需谨慎
- 若队列长期为空或者为满,会导致对应的取、存线程一直处于阻塞,阻塞线程会越变越多
- 只使用一个锁来控制,并发效率低
LinkedBlockingQueue介绍
- 单链表实现
- 线程安全
- 有界
LinkedBlockingQueue内部实现
基本属性
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; }
}
//容量
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.n