java - 为什么 ArrayBlockingQueue 必须有绑定,而 LinkedBlockingQueue 没有?
问题描述
当我实例化时ArrayBlockingQueue
,我还必须将int capacity放入其构造函数中。同样的东西不适用LinkedBlockingQueue
。我很感兴趣为什么会这样?
当然,我也可以将 bound in LinkedBlockingQueue
,但它是最优的。为什么它在这里是最优的,而不是在ArrayBlockingQueue
?不能ArrayBlockingQueue
像默认一样拥有初始容量ArrayList
吗?
解决方案
ArrayBlockingQueue的文档说。
这是一个经典的“有界缓冲区”,其中一个固定大小的数组保存由生产者插入并由消费者提取的元素。一旦创建,容量将无法更改。尝试将元素放入完整队列将导致操作阻塞;尝试从空队列中获取元素同样会阻塞。
由于容量是固定的,不能改变,所以由班级的用户决定队列何时开始阻塞。
LinkedBlockQueue的文档说
基于链接节点的可选有界阻塞队列。此队列对元素进行 FIFO(先进先出)排序。队列的头部是在队列中时间最长的元素。队列的尾部是在队列中时间最短的元素。新元素被插入到队列的尾部,队列检索操作获取队列头部的元素。链接队列通常比基于数组的队列具有更高的吞吐量,但在大多数并发应用程序中性能更不可预测。
可选的容量绑定构造函数参数用作防止过度队列扩展的一种方式。容量(如果未指定)等于 Integer.MAX_VALUE。链接节点在每次插入时动态创建,除非这会使队列超出容量。
在这种情况下,阻塞基于提供的容量。如果指定,则强制执行该阻塞容量与ArrayBlockingQueue
推荐阅读
- ruby-on-rails - 在保存之前验证字段的 API 调用,这是在 before_save 上还是在控制器内部完成?
- python - 如何根据两列对熊猫数据框行进行分组以查找每天的计数?
- mysql - 查询数组字段的where值
- assembly - 使用 RISC-V 的代码找到序列中的最小值并将其与第一个值交换的程序
- android - 如何使用 Gradle 将 KtLint 样式添加到 Android Studio?
- node.js - 自签名证书仅适用于 localhost,不适用于 127.0.0.1
- c# - 为什么 Enumerable 不实现 IEnumerable?
- javascript - 监听子集合的变化
- docker-compose - 如何使用 terraform 重新部署 docker-compose 堆栈?
- javascript - 如何在网页上复制文本内容 30 秒后显示 DIV?