答案 0 :(得分:22)
ArrayBlockingQueue
由一个数组支持,该数组在创建后永远不会更改。将容量设置为Integer.MAX_VALUE
会产生一个空间成本高的大阵列。
ArrayBlockingQueue
总是有限的。
LinkedBlockingQueue
动态创建节点,直到达到capacity
。这是默认Integer.MAX_VALUE
。使用这么大的容量在空间上没有额外的成本。
LinkedBlockingQueue
可选择受限制。
答案 1 :(得分:14)
ArrayBlockingQueue<E>
和LinkedBlockingQueue<E>
是BlockingQueue<E>
接口的常见实现。
ArrayBlockingQueue
由array
支持,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 Implementation正在使用两个Lock Queue算法。因此LinkedBlockingQueue的take和put可以同时工作,但ArrayBlockingQueue不是这种情况。在ArrayBlockingQueue中使用单个锁的原因是,ArrayBlockingQueue必须避免覆盖条目,以便它需要知道开始和结束的位置。 LinkedBlockQueue不需要知道这一点,因为它让GC担心清理队列中的节点。