首页 > 解决方案 > 为什么 ArrayBlockingQueue 必须有绑定,而 LinkedBlockingQueue 没有?

问题描述

当我实例化时ArrayBlockingQueue,我还必须将int capacity放入其构造函数中。同样的东西不适用LinkedBlockingQueue。我很感兴趣为什么会这样?

当然,我也可以将 bound in LinkedBlockingQueue,但它是最优的。为什么它在这里是最优的,而不是在ArrayBlockingQueue?不能ArrayBlockingQueue像默认一样拥有初始容量ArrayList吗?

标签: javaqueueblockingqueue

解决方案


ArrayBlockingQueue的文档说。

这是一个经典的“有界缓冲区”,其中一个固定大小的数组保存由生产者插入并由消费者提取的元素。一旦创建,容量将无法更改。尝试将元素放入完整队列将导致操作阻塞;尝试从空队列中获取元素同样会阻塞。

由于容量是固定的,不能改变,所以由班级的用户决定队列何时开始阻塞。

LinkedBlockQueue的文档说

基于链接节点的可选有界阻塞队列。此队列对元素进行 FIFO(先进先出)排序。队列的头部是在队列中时间最长的元素。队列的尾部是在队列中时间最短的元素。新元素被插入到队列的尾部,队列检索操作获取队列头部的元素。链接队列通常比基于数组的队列具有更高的吞吐量,但在大多数并发应用程序中性能更不可预测。

可选的容量绑定构造函数参数用作防止过度队列扩展的一种方式。容量(如果未指定)等于 Integer.MAX_VALUE。链接节点在每次插入时动态创建,除非这会使队列超出容量。

在这种情况下,阻塞基于提供的容量。如果指定,则强制执行该阻塞容量与ArrayBlockingQueue


推荐阅读