我认为,在大多数情况下,ArrayBlockingQueue会比LinkedBlockingQueue表现得更好。然而,当数组中总是有足够的空间时,就是这种情况...如果它被填满了,它的性能是否会如此好还不是很好预测,因为它会阻塞试图将数据推入队列的线程……
所以,我的问题是:有没有中间层的BlockingQueue实现?比方说,ArrayListBlockingQueue或BucketListBlockingQueue?类似于数组列表,这样队列就可以动态地增加容量,同时仍然可以从使用数组最终存储数据中获得合理的好处?
发布于 2013-12-12 21:07:02
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();
}从构造函数上看,ArrayBlockingQueue和LinkedBlockingQueue最大的区别很明显,一种是底层数据结构是Array,另一种是LinkedList。
ArrayBlockingQueue使用single-lock double condition algorithm,LinkedBlockingQueue是“两锁队列”算法的变体,它有2个锁2个条件( takeLock,putLock)
到目前为止,回到最初的问题,我给出了这两种实现之间的比较,在这次doug Lea关于implementation provided by Dawid Kurzyniec.的concurrency mailing list演讲中,也提出了类似的问题
发布于 2013-07-04 12:36:53
我的2点看法:
首先,这里的底线是你并不真正关心这里的区别,因为即使你使用普通的LinkedBlockingQueue,当你交付一些微秒级的系统时,性能也足够好了。所以这里的性能差异并不是很大。
如果您正在编写一个任务关键型高性能系统,并且您正在使用队列在线程之间传递消息,则始终可以通过以下公式来估计所需的队列大小: queue size = Max are * Max message rate。任何超出这个容量的东西都意味着你的消费速度慢了。在任务关键型应用程序中,这种延迟意味着您的系统出现了故障。可能需要一些手动过程来确保系统正常运行。
如果您的系统不是任务关键型系统,您可以简单地暂停(阻止)发布者,直到一些消费者可用。
https://stackoverflow.com/questions/17061882
复制相似问题