Sergi, we already have getAndSet, is getAndUpdate any different?

On Fri, Sep 18, 2015 at 3:53 PM, Sergi Vladykin <sergi.vlady...@gmail.com>
wrote:

> Actually I can recall discussions related to this signature on java
> concurrency interest mailing list,
> there were some proponents of adding such a method into Atomics, but the
> final resolution was that
> it is not that much different from existing compareAndSet to do the needed
> number of squats
> (it needs intrinsics for different JVM platforms, also there were some
> argues about
> performance, correctness and stuff like that).
>
> I agree that we should go as close to platforms as possible, but for Java
> API it is the same, we should stay
> as close as possible to how things are done in Java.
>
> BTW, it seems that getAndUpdate() can be really efficient for us (avoiding
> round trip on get() and then on
> compareAndSet() which can fail), may be we should create a respective Jira
> issue and ask someone to implement it?
> It must be easy IMO even for newbies. Thoughts?
>
> Sergi
>
>
>
> 2015-09-18 12:35 GMT+03:00 Vladimir Ozerov <voze...@gridgain.com>:
>
> > I was a bit wrong when describing non-Java semantics. "long CAS(old,
> new)"
> > returns what was "old" at the moment of CAS attempt. In your case it will
> > be:
> > T1: CAS(0, 1) => 0 (success)
> > T2: CAS(0, 1) -> 1 (failure)
> >
> > On Fri, Sep 18, 2015 at 12:30 PM, Yakov Zhdanov <yzhda...@apache.org>
> > wrote:
> >
> > > 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.
> > > > >
> > > >
> > >
> >
>



-- 
-- 
Pavel Tupitsyn
GridGain Systems, Inc.
www.gridgain.com

Reply via email to