3

只是想知道为什么他们做了一段LinkedBlockingDeque时间相同的非并发对应物ArrayDeque是支持可调整大小数组的。

LinkedBlockingQueue使用一组像 a 的节点LinkedList(即使没有实现List)。

我知道使用 an 的可能性,ArrayBlockingQueue但是如果有人想使用 anArrayBlockingDeque怎么办?为什么没有这样的选择?

提前致谢。

4

1 回答 1

2

这可能不是一个正确的问题 wrt stackoverflow。但我想谈谈这些实现。

-> 第一件事我们需要回答为什么我们为某个接口提供不同的实现。假设我们有一个接口 A,并且有两个实现让我们说 B 和 C。现在假设这些实现通过它们的实现提供相同的功能。但是 B 的性能比 C 好。那么我们应该删除 implementation,除了两个原因

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。

来自 ArrayDeque 的 Java 文档。

  • 这个类可能比
  • {@link Stack} 用作堆栈时,比 {@link 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.

因此得出结论,没有 ArrayBlockingDeque 实现,因为该实现无法提供超过 LinkedBlockingDeque 的任何额外功能。如果你能证明有什么,那么是的,实施需要在那里:)

于 2013-07-18T06:13:12.180 回答