我认为,在大多数情况下,ArrayBlockingQueue的性能将优于LinkedBlockingQueue。但是,当数组中始终有足够的空间时就是这种情况……如果空间变满,它是否会表现得这么好不是很可预测的,因为它将阻塞试图将数据插入队列的线程。 。

所以,我的问题是:是否有BlockingQueue的中间实现?说,是ArrayListBlockingQueue还是BucketListBlockingQueue?数组列表之类的东西,以便队列可以动态增加容量,同时仍然可以从使用数组最终存储数据中获得合理的 yield ?

最佳答案

1。 LinkedBlockingQueue(LinkedList实现,但不完全是LinkedList的JDK实现。它使用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();
}
从构造函数中可以明显看出ArrayBlockingQueueLinkedBlockingQueue之间的最大区别,一个具有Array的基础数据结构,另一个具有LinkedList的基础数据结构。ArrayBlockingQueue使用single-lock double condition algorithm,而LinkedBlockingQueue是“两个锁队列”算法的变体,它具有2个锁2个条件(takeLock,putLock)
直到现在,我对这两个实现进行了比较。回到原始问题,在这个问题上,concurrency mailing list提出了类似的问题。Lea谈到了DynamicArrayBlockingQueue,即implementation provided by Dawid Kurzyniec.

10-08 15:15