簡體   English   中英

ArrayBlockingQueue如何避免混亂數組元素?

[英]How does ArrayBlockingQueue avoid shuffling array elements?

場景:在我的消費者有機會消費之前,我的制作人填充了數組,比如容量new int [10]。 我的制作人看到數組已滿並阻塞。

然后我的消費者出現並刪除int [0],並向生產者發出信號,表明該數組現在有一個空槽來填充。

我的制作人醒來,並嘗試向數組中添加一個新元素。 考慮到只有int [0]是免費的,我們正在實現FIFO,ArrayBlockingQueue是否將剩余的9個元素向左移動,填充0-8個索引並為生產者留下int [9]?

我查看了實現,但沒有看到任何數組復制功能,

不執行數組元素的復制,因為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();
}

ArrayBlockingQueue維護兩個變量,假設frontIndexrearIndex處理這個而不是移位元素。 如果隊列已滿。 和任何元件由消費者從一個[0],rearIndex移動到每當生產者試圖增加任何元件frontIndex將在9索引之后被移動到0索引下一個時間索引1和索引拉起。 下一個put操作將在[0]上完成

這里FrontIndex == RearIndex表示隊列已滿。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM