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); // Maintains a underlying linkedlist. ( Use when size is not known )
}
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]; // Maintains a underlying array
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 提供的实现。