场景:在我的消费者有机会消费之前,我的生产者填充数组,比如容量新int10。我的制作人看到数组已满并阻塞。
然后,我的使用者出现并移除int,并向生产者发出信号,表示数组现在有一个空槽要填充。
我的生产者醒了,并尝试向数组中添加一个新元素。考虑到只有int是免费的,而且我们正在实现FIFO,那么ArrayBlockingQueue是否将剩下的9个元素都移到左边,填充0-8个索引,并将int9留给生产者呢?
我看过实现,但没有看到任何数组复制功能,
发布于 2016-11-10 11:56:32
不执行数组元素的复制,因为ArrayBlockingQueue使用数组作为循环缓冲区。它维护两个索引,takeIndex和putIndex,并在它们到达数组末尾时包装它们。
在添加或接受元素的操作之后,它调用一个名为inc的私有“增量”方法,该方法将索引封装在末尾:
final int inc(int i) {
return (++i == items.length)? 0 : i;
}下面是如何使用此方法的示例:
private void insert(E x) {
items[putIndex] = x;
putIndex = inc(putIndex); // <<== Wraps around
++count;
notEmpty.signal();
}发布于 2016-11-10 12:03:16
ArrayBlockingQueue维护两个变量,假设、frontIndex、和rearIndex来处理这个问题,而不是移动元素。如果队列已满。消费者从索引a中提取任何元素,然后rearIndex移动到索引1,下次每当生产者尝试添加任何元素frontIndex时,将在E 1159<代码>E 216索引之后移动到E 214索引。下一个put操作将在a上完成。
这里,FrontIndex==RearIndex表示队列已满。
https://stackoverflow.com/questions/40526943
复制相似问题