【问题标题】:ArrayDeque and LinkedBlockingDequeArrayDeque 和 LinkedBlockingDeque
【发布时间】:2013-07-14 12:55:56
【问题描述】:

只是想知道为什么他们创建了一个LinkedBlockingDeque,而相同的非并发对应物是一个ArrayDeque,它支持一个可调整大小的数组。

LinkedBlockingQueue 使用一组节点,例如 LinkedList(即使没有实现 List)。

我知道使用ArrayBlockingQueue 的可能性,但如果有人想使用ArrayBlockingDeque 怎么办? 为什么没有这个选项?

提前致谢。

【问题讨论】:

标签: java concurrency queue deque


【解决方案1】:

这可能不是一个正确的问题 w.r.t 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 与 LinkedBlockingQueue 如果我需要有界队列,我将使用 ArrayBlockingQueue,否则我将使用 LinkedBlockingQueue。

现在你的问题为什么存在 LinkedBlockingDeque 时没有 ArrayBlockingDeque

首先让我们看看为什么存在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。如果你能证明有 那么是的,需要实现:)

【讨论】:

  • 那么在这一点上,为什么要基于数组制作 ArrayBlockingQueue 呢?我的意思是有一个有界的 LinkedBlockingQueue 会不一样吗?由于没有随机访问..问题出在哪里?感谢回复
  • 这个分析在几个方面是错误的。比如不考虑缓存,不考虑链表的链表元素引入的类开销,...
猜你喜欢
  • 1970-01-01
  • 2012-05-17
  • 2011-10-01
  • 1970-01-01
  • 2021-02-24
  • 2017-10-13
  • 2013-05-04
  • 1970-01-01
  • 2023-03-26
相关资源
最近更新 更多