Re: The code example in onSpinWait() Javadoc

Francesco Nigro via Concurrency-interest <[email protected]>
Newsgroups gmane.comp.java.jsr.166-concurrency
Message-ID <CAKxGtTVGKvQd3KT3f8ROuzZpNKNS4XEeKZeRfAppwYFATZKPfQ@mail.gmail.com>
Sorry I've written on the email text, I forgot an important part, let me
write it properly:

   volatile E obj = null;
   volatile boolean done = false;

   public void offerOnce(E o) {
      Objects.checkNonNull(o);
      this.done = true;
      this.obj = o;
   }

  public boolean isDone() {
       return done;
  }

   public E poll() {
      E o = this.obj;
      if (o == null && !this.done) {
         return null;
      }
      //o will be !null at some point
      do {
         if (o != null)
            return o;
         java.lang.Thread.onSpinWait();
         this.obj = o;
      } while(true);
   }

Similarly to the queue API: poll should return null iff !done, but offer
update first done and then this.obj:
poll need to read obj, but has to stay consistent to the ordering, so at
some point, obj will be visible if done == true.
On JCtools we have some queues with a similar behaviour (producer sequence
is advanced before writing the actual element in the queue)
and we need to spin wait the element apprearence to stay consistent with
the isEmpty behaviour: that's a good use case for onSpinWait (when it works
:P).



Il giorno gio 14 nov 2019 alle ore 16:43 Andrew Haley <[email protected]> ha
scritto:

> On 11/14/19 3:31 PM, Francesco Nigro via Concurrency-interest wrote:
> >     E o = this.obj;
> >     if (o == null && !done) {
> >         return null;
> >      }
> >      //o will be !null at some point
> >      do {
> >          if (o != null)
> >             return o;
> >          java.lang.Thread.onSpinWait();
> >      } while(true);
> > }
> >
> > In case like this is more appropriate, maybe, but much less intuitive
> > probably.
>
> Umm, what? o is a local. This loop spins forever.
>
> --
> Andrew Haley  (he/him)
> Java Platform Lead Engineer
> Red Hat UK Ltd. <https://www.redhat.com>
> https://keybase.io/andrewhaley
> EAC8 43EB D3EF DB98 CC77 2FAD A5CD 6035 332F A671
>
>

_______________________________________________
Concurrency-interest mailing list
[email protected]
http://cs.oswego.edu/mailman/listinfo/concurrency-interest
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.