Re: Are there real use cases with the Java access modes?

SHUYANG LIU via Concurrency-interest <[email protected]> Mon, 19 Jul 2021 09:34:25 -0700
Newsgroups gmane.comp.java.jsr.166-concurrency
Message-ID <CABsauHP-HV3EeCq+ty64-pzEK6i51GbJgQnKVMMcgtYM1bp3Jg@mail.gmail.com>
Thank you! I’ll take a look at them.

Best,
Shuyang

On Mon, Jul 19, 2021 at 12:57 AM Benjamin Manes <[email protected]> wrote:

> Another avenue to explore are usages of the older Unsafe's putOrdered and
> Atomic's delegate of lazySet. While these were introduced in JDK5, the
> naming and meaning was confusing and are not widely used. It is now
> explicitly acquire/release ordering in JDK9. JCTools is a good example of
> such usages.
>
> When reviewing Caffeine, there are more cases that I had forgotten about
> which use weaker ordering, such as when populating an element in an MPSC
> ring buffer. Similarly, it seems that LMAX disruptor is also using
> acquire/release for its ring buffer logic.
>
> On Sat, Jul 17, 2021 at 4:50 PM Shuyang Liu <[email protected]> wrote:
>
>> Thank you for the detailed explanation! I'll take a look at the code in
>> Caffine.
>>
>> > There probably are not many valid use-cases outside of the JDK, and all
>> others (including below) should probably be considered suspect.
>> This is why we are asking for help here :) We couldn't find many
>> interesting use cases after a basic search. Your example is a good one.
>> I'll look into how JDK uses it.
>>
>> Best,
>> Shuyang
>>
>> ------------------------------
>> *From: *"Benjamin Manes" <[email protected]>
>> *To: *"Shuyang Liu" <[email protected]>
>> *Cc: *"concurrency-interest" <[email protected]>
>> *Sent: *Saturday, July 17, 2021 3:18:22 PM
>> *Subject: *Re: [concurrency-interest] Are there real use cases with the
>> Java access modes?
>>
>> There is one usage of acquire / release in Caffeine for a weak / soft
>> values cache. It looks something like the below snippet. It has the
>> following characteristics:
>>
>> 1. During construction, a plain set is used as the entry is not yet
>> visible to other threads. That can piggyback on the lock release.
>> 2. Reading the value can usually use a plain read to piggyback on the
>> map's volatile read of the entry, of which this class is the entry's value
>> object.
>> 3. When the referent is null, it may either be due to the garbage
>> collector or a cache.put(k,v) setting a new reference and nulling out the
>> old one. An acquire is used to check for a stale read.
>> 4. When writing, a release is used to ensure that clearing the reference
>> is ordered after the value is set. This way an intermediate null is not
>> read due to a compiler reordering.
>>
>> In general, though, most developers would prefer to use stronger
>> orderings than necessary as simpler to reason about with equivalent
>> performance. There probably are not many valid use-cases outside of the
>> JDK, and all others (including below) should probably be considered suspect.
>>
>> ----
>>
>> static final VarHandle VALUE;
>>
>> Node(Object keyReference, V value, ReferenceQueue<V> referenceQueue) {
>>   VALUE.set(this, new WeakValueReference<V>(keyReference, value,
>> referenceQueue));
>> }
>>
>> public final V getValue() {
>>   for (;;) {
>>     Reference<V> ref = (Reference<V>) VALUE.get(this);
>>     V referent = ref.get();
>>     if ((referent != null) || (ref == VALUE.getAcquire(this))) {
>>       return referent;
>>     }
>>   }
>> }
>>
>> public final void setValue(V value, ReferenceQueue<V> referenceQueue) {
>>   Reference<V> ref = (Reference<V>) VALUE.get(this);
>>   VALUE.setRelease(this, new WeakValueReference<V>(getKeyReference(),
>> value, referenceQueue));
>>   ref.clear();
>> }
>>
>>
>> On Sat, Jul 17, 2021 at 1:32 PM Shuyang Liu via Concurrency-interest <
>> [email protected]> wrote:
>>
>>> Hello,
>>>
>>> My colleagues and I have been working on a formal model for the Java
>>> access modes that is added since Java 9 [1]. Are there any popular use
>>> cases of access modes in real world applications/frameworks/libraries? We
>>> would like to see how our current formal model works in real examples.
>>>
>>> Thanks you,
>>> Shuyang Liu
>>>
>>> [1]. Using JDK 9 Memory Order Modes
>>> http://gee.cs.oswego.edu/dl/html/j9mm.html
>>> _______________________________________________
>>> Concurrency-interest mailing list
>>> [email protected]
>>> http://cs.oswego.edu/mailman/listinfo/concurrency-interest
>>>
>>
>>

_______________________________________________
Concurrency-interest mailing list
[email protected]
http://cs.oswego.edu/mailman/listinfo/concurrency-interest