The*_*der 6 java queue multithreading
场景:在我的消费者有机会消费之前,我的制作人填充了数组,比如容量new int [10].我的制作人看到数组已满并阻塞.
然后我的消费者出现并删除int [0],并向生产者发出信号,表明该数组现在有一个空槽来填充.
我的制作人醒来,并尝试向数组中添加一个新元素.考虑到只有int [0]是免费的,我们正在实现FIFO,ArrayBlockingQueue是否将剩余的9个元素向左移动,填充0-8个索引并为生产者留下int [9]?
我查看了实现,但没有看到任何数组复制功能,
不执行数组元素的复制,因为ArrayBlockingQueue将数组用作循环缓冲区.它维护两个索引,takeIndex并putIndex在它们到达数组末尾时将它们包装起来.
在添加或获取元素的操作之后,它调用一个名为的私有"increment"方法inc,该方法将索引包装在末尾:
final int inc(int i) {
return (++i == items.length)? 0 : i;
}
Run Code Online (Sandbox Code Playgroud)
以下是如何使用此方法的示例:
private void insert(E x) {
items[putIndex] = x;
putIndex = inc(putIndex); // <<== Wraps around
++count;
notEmpty.signal();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
90 次 |
| 最近记录: |