ArrayBlockingQueue和LinkedBlockingQueue有什么区别

时间:2013-08-22 08:33:33

标签: java blockingqueue blockingcollection

  1. 使用ArrayBlockingQueue更好的方法是什么,何时使用LinkedBlockingQueue会更好?
  2. 如果LinkedBlockingQueue默认容量等于MAX Integer,将它用作具有默认容量的BlockingQueue真的有用吗?

4 个答案:

答案 0 :(得分:22)

ArrayBlockingQueue由一个数组支持,该数组在创建后永远不会更改。将容量设置为Integer.MAX_VALUE会产生一个空间成本高的大阵列。 ArrayBlockingQueue总是有限的。

LinkedBlockingQueue动态创建节点,直到达到capacity。这是默认Integer.MAX_VALUE。使用这么大的容量在空间上没有额外的成本。 LinkedBlockingQueue可选择受限制。

答案 1 :(得分:14)

ArrayBlockingQueue<E>LinkedBlockingQueue<E>BlockingQueue<E>接口的常见实现。

ArrayBlockingQueuearray支持,Queue将订单强加为FIFO。队列的头部是时间最古老的元素,队列的尾部是最年轻的元素。另一方面,ArrayBlockingQueue也是固定大小的有界缓冲区LinkedBlockingQueue是构建在链接节点之上的可选有界队列。

可选的容量绑定构造函数参数用作防止过多队列扩展的方法,因为如果未指定容量,则它等于Integer.MAX_VALUE

了解更多来自here

基准:http://www.javacodegeeks.com/2010/09/java-best-practices-queue-battle-and.html

答案 2 :(得分:6)

向ArrayBlockingQueue添加元素应该更快,因为它意味着只设置对后备Object数组元素的引用,而向LinkedBlockingQueue添加元素意味着创建一个Node并设置其item,prev和next字段。此外,当我们从LinkedBlockingQueue中删除一个元素时,删除的节点会变成垃圾,这可能会影响应用程序的性能。

对于内存消耗,ArrayBlockingQueue始终保持一个具有完整容量的Object数组,即使是空的。另一方面,LinkedBlockingQueue中的一个元素是一个带有3个对象字段的Object的节点。

答案 3 :(得分:6)

ArrayBlockingQueue

ArrayBlockingQueue是一个有界的阻塞队列,它将元素存储在数组内部。它有界意味着它无法存储无限量的元素。它可以同时存储的元素数量有一个上限。您在实例化时设置上限,之后无法更改。

LinkedBlockingQueue

LinkedBlockingQueue将元素保留在链接结构(链接节点)内部。如果需要,该连接结构可任选地具有上限。如果未指定上限,则使用Integer.MAX_VALUE作为上限。

<强>相似度

ArrayBlockingQueue / LinkedBlockingQueue以FIFO(先进先出)顺序在内部存储元素。队列的头部是队列中时间最长的元素,队列的尾部是队列中最短时间的元素。

差异

  • LinkedBlockingQueue分别有一个putLock和一个takeLock用于插入和删除,但ArrayBlockingQueue只使用1个锁。
  • ArrayBlockingQueue使用单锁双重条件算法,LinkedBlockingQueue是“双锁队列”算法的变体,它有2个锁2条件(takeLock,putLock)。

LinkedBlockingQueue Implementation正在使用两个Lock Queue算法。因此LinkedBlockingQueue的take和put可以同时工作,但ArrayBlockingQueue不是这种情况。在ArrayBlockingQueue中使用单个锁的原因是,ArrayBlockingQueue必须避免覆盖条目,以便它需要知道开始和结束的位置。 LinkedBlockQueue不需要知道这一点,因为它让GC担心清理队列中的节点。