[英]How does ArrayBlockingQueue avoid shuffling array elements?
場景:在我的消費者有機會消費之前,我的制作人填充了數組,比如容量new int [10]。 我的制作人看到數組已滿並阻塞。
然后我的消費者出現並刪除int [0],並向生產者發出信號,表明該數組現在有一個空槽來填充。
我的制作人醒來,並嘗試向數組中添加一個新元素。 考慮到只有int [0]是免費的,我們正在實現FIFO,ArrayBlockingQueue是否將剩余的9個元素向左移動,填充0-8個索引並為生產者留下int [9]?
我查看了實現,但沒有看到任何數組復制功能,
不執行數組元素的復制,因為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();
}
ArrayBlockingQueue
維護兩個變量,假設frontIndex和rearIndex處理這個而不是移位元素。 如果隊列已滿。 和任何元件由消費者從一個[0],則rearIndex移動到每當生產者試圖增加任何元件frontIndex將在9索引之后被移動到0索引下一個時間索引1和索引拉起。 下一個put操作將在[0]上完成 。
這里FrontIndex == RearIndex表示隊列已滿。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.