为什么使用Array实现BlockingQueue?

时间:2014-06-02 05:34:12

标签: java java.util.concurrent

为什么我认为ArrayBlockingQueue实现没有意义 -

  1. 队列总是在末尾添加并从前面删除。这意味着链表将是实现它的最有效的数据结构。
  2. 永远不会使用索引访问队列项,因此它无法实现索引数据结构的目的
  3. 阵列总是预分配,难以增加/减小结构
  4. 数组需要连续的内存分配,这不是队列的用例,它可能会触发GC的压缩循环以解压缩堆
  5. 删除数组的第一个元素意味着重新排序其余的索引,这是队列的最常见用例。为什么要承担这个开销?
  6. 有人不这么认为吗?

2 个答案:

答案 0 :(得分:4)

是的,Javadoc

  

这是一个经典的“有界缓冲区”,其中包含固定大小的数组   生产者插入并由消费者提取的元素。的一旦   创建后,容量无法更改。

你需要的只是头部和尾部的索引。

答案 1 :(得分:2)

如果您实际查看了实现,您会看到ArrayBlockingQueue使用数组作为环形缓冲区。这意味着虽然它对其操作有微不足道的影响,需要进行简单的整数计算,但是不需要重新分配或重新排序任何东西。