JDK1.8 LinkedBlockingQueue类说明
介绍
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();
}
}
- 点赞
- 收藏
- 关注作者
评论(0)