Primitive Queue<any T> considerations

MacGregor, Duncan (GE Energy Management) duncan.macgregor at ge.com
Wed Nov 18 18:53:11 UTC 2015



On 18/11/2015, 16:22, "valhalla-dev on behalf of Dávid Karnok"
<valhalla-dev-bounces at openjdk.java.net on behalf of akarnokd at gmail.com>
wrote:

>Let's assume I have a value type named cell:
>
>valuetype Cell<any T> {
>   public T value;
>   public int mark;
>}
>
>and a power-of-2 array of cells:
>
>Cell<any T>[] array;
>
>
>having Cell with final fields is useless here because then I have a
>constant array and not a queue.

Maybe I¹m not following you here but the fact fields on a Cell are final
does not stop you from replacing one Cell in array with a new Cell, just
as you can replace individual ints in an array of ints.

So you offset method would be more like

offset = producerIndex & (array.length - 1)
if (array[offset].mark != 0) {
    return false;
}
array[offset] = Cell(value, 1);
producerIndex++;

return true;

And that operation on the array will be guaranteed to be atomic (though
probably needs a compare and swap in case another thread is trying to do
the same thing).

Duncan.



More information about the valhalla-dev mailing list