1. LinkedBlockingQueue
(LinkedList
实现,但不完全是JDK中LinkedList
的实现。它使用static inner class Node
来维护元素之间的链接)
Constructor for LinkedBlockingQueue
public LinkedBlockingQueue(int capacity)
{
if (capacity < = 0) throw new IllegalArgumentException();
this.capacity = capacity;
last = head = new Node< E >(null);
}
Node
类用于维护链接
static class Node<E> {
E item;
Node<E> next;
Node(E x) { item = x; }
}
2. ArrayBlockingQueue
(数组实现)
ArrayBlockingQueue
的构造函数
public ArrayBlockingQueue(int capacity, boolean fair)
{
if (capacity < = 0)
throw new IllegalArgumentException();
this.items = new Object[capacity];
lock = new ReentrantLock(fair);
notEmpty = lock.newCondition();
notFull = lock.newCondition();
}
ArrayBlockingQueue
和LinkedBlockingQueue
之间最大的区别可以从构造函数中看出,一个使用Array
作为基础数据结构,另一个使用LinkedList
。
ArrayBlockingQueue
使用单锁双条件算法,而LinkedBlockingQueue
是“双锁队列”算法的一种变体,它有2个锁和2个条件(takeLock,putLock)。
到目前为止,我已经给出了这两种实现之间的比较。回到最初的问题,类似的问题在并发邮件列表上被问到,在这里Doug Lea谈到了DynamicArrayBlockingQueue,它是Dawid Kurzyniec提供的实现。