gpt4 book ai didi

Java:ArrayBlockingQueue 与 LinkedBlockingQueue

转载 作者:太空狗 更新时间:2023-10-29 22:40:03 25 4
gpt4 key购买 nike

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

所以,我的问题是:BlockingQueue 是否有任何中间实现?比如,ArrayListBlockingQueue 还是 BucketListBlockingQueue?像数组列表这样的东西,这样队列可以动态增加容量,同时仍然从使用数组最终存储数据中获得合理的好处?

最佳答案

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 类用来维护Links

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,另一个是链表.

ArrayBlockingQueue 使用 single-lock double condition algorithm LinkedBlockingQueue 是“双锁队列”算法的变体,它有 2 个锁和 2 个条件(takeLock,putLock)

到现在为止,我对这两种实现进行了比较 回到原来的问题,在 concurrency mailing list 中提出了类似的问题在这篇文章中,Doug Lea 谈到了 DynamicArrayBlockingQueue,它是 implementation provided by Dawid Kurzyniec.

关于Java:ArrayBlockingQueue 与 LinkedBlockingQueue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17061882/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com