Primitive Queue<any T> considerations

Vitaly Davidovich vitalyd at gmail.com
Wed Nov 18 18:55:42 UTC 2015


As discussed upthread, how would that operation be atomic for arbitrarily
sized value types?

On Wed, Nov 18, 2015 at 1:53 PM, MacGregor, Duncan (GE Energy Management) <
duncan.macgregor at ge.com> wrote:

>
>
> 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