Vladimir,

Signature "long CAS(old, new)" does not work in my understanding. Imagine
current value is 0 and 2 threads do CAS(0, 1). Both will get 1? How can I
distinguish which thread really succeeds? Or one of the threads will get
"0"?

As far as .net API, I am OK to have .net approach for such functionality.

--Yakov

2015-09-17 21:42 GMT+03:00 Vladimir Ozerov <voze...@gridgain.com>:

> Lets put getAndUpdate() aside for now, because is not what the question
> about. Of course we can add this operation to Java, no problems. But we are
> talking about a single CAS, not spin-loop.
>
> The problem is that for .Net/CPP guy CAS on long is not "bool CAS(old,
> new)". For him CAS is "long CAS(old, new)", where returned value is either
> "new" in case of success, or what was in place of "old" in case of failure.
> And we definitely will implement platform datastructures in that way,
> because we cannot force .Net/CPP users use Java concepts instead of their
> native counterparts.
>
> For platforms this can be achieved with only minor change to
> GridCacheAtomicLongImpl.internalCompareAndSet. So we can even do not place
> it on Java public API, because as for Java users this is really "weird".
>
>
> On Thu, Sep 17, 2015 at 9:18 PM, Alexey Goncharuk <
> alexey.goncha...@gmail.com> wrote:
>
> > 2015-09-17 10:55 GMT-07:00 Vladimir Ozerov <voze...@gridgain.com>:
> >
> > This is not something weird, but rather how things work everywhere except
> > > of Java. getAndUpdate() is not what we need, because it is a CAS loop,
> > not
> > > CAS.
> > >
> >
> > This is an implementation detail. For a distributed data structure it
> will
> > never be a CAS loop because we always acquire a lock for the
> corresponding
> > cache entry and then run an entry processor. Agree with Sergi, I would
> > rather name it getAndUpdate to be consistent with java AtomicLong since
> > this is the class which IgniteAtomicLong was mimicking in the first
> place.
> >
>

Reply via email to