Jav*_*ack 38 java blockingqueue blockingcollection
Fab*_*ney 24
ArrayBlockingQueue
由数组支持,该数组在创建后永远不会更改.设置容量Integer.MAX_VALUE
将创建一个空间成本高的大阵列.
ArrayBlockingQueue
永远是有限的.
LinkedBlockingQueue
动态创建节点,直到capacity
达到.这是默认情况Integer.MAX_VALUE
.使用这么大的容量在空间上没有额外的成本.
LinkedBlockingQueue
任选地是有界的.
Ank*_*thi 16
ArrayBlockingQueue<E>
并且LinkedBlockingQueue<E>
是BlockingQueue<E>
界面的常见实现 .
ArrayBlockingQueue
得到支持array
并Queue
强制执行命令FIFO
.队列的头部是时间最古老的元素,队列的尾部是最年轻的元素.ArrayBlockingQueue
另一方面,固定大小有界缓冲区LinkedBlockingQueue
是一个构建在链接节点之上的可选有界队列.
可选的容量绑定构造函数参数用作防止过多队列扩展的方法,因为如果未指定容量,则它等于Integer.MAX_VALUE
.
阅读更多从这里开始.
基准:http://www.javacodegeeks.com/2010/09/java-best-practices-queue-battle-and.html
ArrayBlockingQueue:
ArrayBlockingQueue是一个有界的阻塞队列,它将元素存储在数组内部.它有界意味着它无法存储无限量的元素.它可以同时存储的元素数量有一个上限.您在实例化时设置上限,之后无法更改.
的LinkedBlockingQueue
LinkedBlockingQueue将元素保留在链接结构(链接节点)内部.如果需要,该连接结构可任选地具有上限.如果未指定上限,则使用Integer.MAX_VALUE作为上限.
相似
ArrayBlockingQueue/LinkedBlockingQueue在内部以FIFO(先进先出)顺序存储元素.队列的头部是队列中最长时间的元素,队列的尾部是队列中最短时间的元素.
差异
LinkedBlockingQueue Implementation正在使用两个Lock Queue算法.因此LinkedBlockingQueue的take和put可以同时工作,但ArrayBlockingQueue不是这种情况.在ArrayBlockingQueue中使用单个锁的原因是,ArrayBlockingQueue必须避免覆盖条目,以便它需要知道开始和结束的位置.LinkedBlockQueue不需要知道这一点,因为它让GC担心清理队列中的节点.
向ArrayBlockingQueue添加元素应该更快,因为它意味着只设置对后备Object数组元素的引用,而向LinkedBlockingQueue添加元素意味着创建一个Node并设置其item,prev和next字段.此外,当我们从LinkedBlockingQueue中删除一个元素时,删除的节点会变成垃圾,这可能会影响应用程序的性能.
至于内存消耗,ArrayBlockingQueue总是保持一个具有完整容量的Object数组,即使是空的.另一方面,LinkedBlockingQueue中的一个元素是具有3个对象字段的Object的节点.
归档时间: |
|
查看次数: |
33743 次 |
最近记录: |