ArrayDeque and LinkedBlockingDeque

3

想知道为什么会有一个LinkedBlockingDeque,而没有并发的相对应的,是一个基于可调整大小的数组的ArrayDeque

LinkedBlockingQueue使用一组类似于LinkedList(尽管没有实现List)的节点。

我知道可以使用ArrayBlockingQueue,但如果想要使用ArrayBlockingDeque呢?为什么没有这样的选择?

提前感谢。


你所陈述的并不是一个真正的问题(请参考http://stackoverflow.com/help/dont-ask,特别是“没有实际问题需要解决”部分)。 - SirRichie
1个回答

2

这可能不是一个关于stackoverflow的合适问题。但我想对这些实现做出一些评论。

-> 首先,我们需要回答为什么针对某个接口我们会提供不同的实现。 假设我们有一个接口A,并且有两个实现B和C。现在假设这些实现通过其实现提供相同的功能。 但是B比C具有更好的性能。 那么我们应该除了两个原因之外删除实现

1. Backward Compatibility - marking as deprecated.
2. There is a specific scenario where we cannot use B implementation.

例如:
HashMap和LinkedHashMap-> 如果我需要有序的键,我将使用LinkedHashMap,否则我将使用HashMap(为了获得一些性能提升)。
ArrayBlockingQueue vs LinkedBlockingQueue-> 如果我需要有限队列,我将使用ArrayBlockingQueue,否则我将使用LinkedBlockingQueue。
现在你的问题是为什么没有ArrayBlockingDeque而LinkedBlockingDeque存在。
首先让我们看看为什么存在ArrayDeque。
从Java文档中可以看到,这个类在用作堆栈时比Stack更快,在用作队列时比LinkedList更快。同时请注意,ArrayDeque没有容量限制。此外,它有两个指针用于头和尾,就像LinkedList实现中使用的那样。
因此,如果有ArrayBlockingDeque的话。
1. There would have been no Capacity Restriction, which we normally 
   get from ArrayBlockingQueue.

2. There would have guards to access to tail and head pointers
   same as in LinkedBlockingDeque and therefore no significant performance 
   gain over LinkedBlockingDeque.

因为LinkedBlockingDeque已经提供了足够的功能,所以没有ArrayBlockingDeque实现。如果你能证明有额外的需求,那么就需要实现它 :)

那么,为什么要基于数组创建ArrayBlockingQueue呢?我的意思是,使用有界的LinkedBlockingQueue不是一样吗?既然没有随机访问...问题在哪里?谢谢回复。 - Rollerball
这个分析在多个方面是错误的。例如,它没有考虑缓存,也没有考虑链表中列表元素引入的类开销,... - Till Schäfer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接