首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java: ArrayBlockingQueue与LinkedBlockingQueue

Java: ArrayBlockingQueue与LinkedBlockingQueue
EN

Stack Overflow用户
提问于 2013-06-12 17:20:26
回答 2查看 22.3K关注 0票数 18

我认为,在大多数情况下,ArrayBlockingQueue会比LinkedBlockingQueue表现得更好。然而,当数组中总是有足够的空间时,就是这种情况...如果它被填满了,它的性能是否会如此好还不是很好预测,因为它会阻塞试图将数据推入队列的线程……

所以,我的问题是:有没有中间层的BlockingQueue实现?比方说,ArrayListBlockingQueueBucketListBlockingQueue?类似于数组列表,这样队列就可以动态地增加容量,同时仍然可以从使用数组最终存储数据中获得合理的好处?

EN

回答 2

Stack Overflow用户

发布于 2013-12-12 21:07:02

1.LinkedBlockingQueue ( LinkedList实现,但不完全是LinkedList的JDK实现。它使用static inner class Node来维护元素之间的链接)

代码语言:javascript
复制
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

代码语言:javascript
复制
static class Node<E> {
    E item;
    Node<E> next;
    Node(E x) { item = x; }
}

2.ArrayBlockingQueue (数组实现)

ArrayBlockingQueue的构造函数

代码语言:javascript
复制
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 algorithmLinkedBlockingQueue是“两锁队列”算法的变体,它有2个锁2个条件( takeLock,putLock)

到目前为止,回到最初的问题,我给出了这两种实现之间的比较,在这次doug Lea关于implementation provided by Dawid Kurzyniec.concurrency mailing list演讲中,也提出了类似的问题

票数 14
EN

Stack Overflow用户

发布于 2013-07-04 12:36:53

我的2点看法:

首先,这里的底线是你并不真正关心这里的区别,因为即使你使用普通的LinkedBlockingQueue,当你交付一些微秒级的系统时,性能也足够好了。所以这里的性能差异并不是很大。

如果您正在编写一个任务关键型高性能系统,并且您正在使用队列在线程之间传递消息,则始终可以通过以下公式来估计所需的队列大小: queue size = Max are * Max message rate。任何超出这个容量的东西都意味着你的消费速度慢了。在任务关键型应用程序中,这种延迟意味着您的系统出现了故障。可能需要一些手动过程来确保系统正常运行。

如果您的系统不是任务关键型系统,您可以简单地暂停(阻止)发布者,直到一些消费者可用。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17061882

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档