Scenario: My producer fills the array up, say capacity new int[10], before my consumer gets a chance to consume any. My producer sees the array is full and blocks.
Then my consumer comes along and removes int[0], and signals to the producer that the array now has an empty slot to fill.
My producer wakes up, and tries to add a new element to the array. Considering only int[0] is free, and we are implementing FIFO, does ArrayBlockingQueue shuffle all the remaining 9 elements to the left, filling 0-8 indexes and leave int[9] free for the producer?
I've looked at the implementation but don't see any array copy functionality,
No copying of array elements is performed, because ArrayBlockingQueue
uses the array as a circular buffer. It maintaining two indexes, takeIndex
and putIndex
, and wraps them around when they reach the end of the array.
After an operation that adds or takes an element it calls a private "increment" method called inc
, which wraps the index around the end:
final int inc(int i) {
return (++i == items.length)? 0 : i;
}
Here is an example of how this method is used:
private void insert(E x) {
items[putIndex] = x;
putIndex = inc(putIndex); // <<== Wraps around
++count;
notEmpty.signal();
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With