ArrayBlockingQueue如何避免混乱数组元素?

时间:2016-11-10 11:51:08

标签: java multithreading queue

方案: 在我的消费者有机会消费之前,我的制作人填充了数组,比如容量new int [10]。我的制作人看到数组已满且阻塞。

然后我的消费者出现并删除int [0],并向生产者发出信号,表明该数组现在有一个空槽来填充。

我的制作人醒来,并尝试向数组中添加一个新元素。考虑到只有int [0]是免费的,我们正在实现FIFO,ArrayBlockingQueue是否将剩余的9个元素向左移动,填充0-8个索引并为生产者留下int [9]?

我查看了实现,但没有看到任何数组复制功能,

2 个答案:

答案 0 :(得分:5)

不执行数组元素的复制,因为ArrayBlockingQueue将数组用作循环缓冲区。它维护两个索引takeIndexputIndex,并在它们到达数组末尾时将它们包装起来。

在添加或接受元素的操作之后,它调用一个名为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();
}

答案 1 :(得分:0)

ArrayBlockingQueue维护两个变量,假设 frontIndex rearIndex 来处理此变量而不是移位元素。如果队列已满。消费者从索引 a [0] 中提取任何元素,然后将 rearIndex 移至索引 1 ,并在下次生产者尝试添加任何元素 frontIndex 将移至 9 索引后的 0 索引。下一个put操作将在 a [0] 上完成。

此处 FrontIndex == RearIndex 表示队列已满。