ArrayBlockingQueue和LinkedBlockingQueue有什么区别

2022-09-01 01:30:50
  1. 在什么情况下使用 ArrayBlockingQueue 更好,什么时候使用 LinkedBlockingQueue 更好?
  2. 如果 LinkedBlockingQueue 默认容量等于 MAX Integer,那么将其用作具有默认容量的 BlockingQueue 真的有帮助吗?

答案 1

ArrayBlockingQueue由一个数组支持,该数组的大小在创建后永远不会更改。将容量设置为将创建一个空间成本较高的大型阵列。 始终是有界的。Integer.MAX_VALUEArrayBlockingQueue

LinkedBlockingQueue动态创建节点,直到到达 。默认情况下,这是 。使用如此大的容量不会在空间上产生额外的成本。 是可选的有界的。capacityInteger.MAX_VALUELinkedBlockingQueue


答案 2

数组阻止队列

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

链接阻止队列

LinkedBlockingQueue 将元素保存在链接结构(链接节点)的内部。如果需要,此链接结构可以选择具有上限。如果未指定上限,则使用 Integer.MAX_VALUE 作为上限。

相似

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

差异

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

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


推荐