为什么ArrayBlockingQueue必须绑定而LinkedBlockingQueue没有绑定?

问题描述

实例化ArrayBlockingQueue时,还必须在其构造函数中放入 int容量。同一件事不适用于LinkedBlockingQueue。我对这为什么感兴趣?

当然,我也可以在LinkedBlockingQueue中加入绑定,但这是最佳选择。为什么在这里而不是在ArrayBlockingQueue中是最佳的? ArrayBlockingQueue不能像ArrayList那样具有认的初始容量吗?

解决方法

ArrayBlockingQueue的文档说。

这是经典的“有界缓冲区”,其中固定大小的数组包含生产者插入并由消费者提取的元素。 创建后,容量将无法更改。尝试将元素放入完整队列将导致操作阻塞;尝试从空队列中获取元素的尝试也会类似地被阻止。

由于容量是固定的并且不能更改,因此由类的用户来决定何时应开始阻塞队列。

LinkedBlockQueue的文档说

基于链接节点的可选绑定的阻塞队列。该队列对元素FIFO(先进先出)进行排序。队列的开头是已在队列中停留最长时间的元素。队列的尾部是最短时间位于队列中的元素。新元素插入到队列的尾部,并且队列检索操作在队列的开头获取元素。链接队列通常比基于阵列的队列具有更高的吞吐量,但是在大多数并发应用程序中,可预测的性能却较低。

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

在这种情况下,基于提供的容量进行阻止。如果指定,则与ArrayBlockingQueue

相同的强制容量