gpt4 book ai didi

java - ArrayBlockingQueue 如何避免混洗数组元素?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:16:21 25 4
gpt4 key购买 nike

场景:在我的消费者有机会消费之前,我的生产者填满了数组,比如 capacity new int[10]。我的生产者看到数组已满并阻塞。

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

我的生产者醒来,并尝试向数组中添加一个新元素。考虑到只有 int[0] 是空闲的,并且我们正在实现 FIFO,ArrayBlockingQueue 是否将所有剩余的 9 个元素向左移动,填充 0-8 索引并让 int[9] 空闲给生产者?

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

最佳答案

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

在添加或获取元素的操作之后,它调用名为 inc 的私有(private)“增量”方法,该方法将索引环绕在末尾:

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();
}

关于java - ArrayBlockingQueue 如何避免混洗数组元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40526943/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com