Unasafe.putOdered -> Unsafe.releasePut

Andrew Haley aph at redhat.com
Thu Mar 5 09:16:07 UTC 2015


On 05/03/15 00:49, David Holmes wrote:
> On 2/03/2015 9:54 PM, Paul Sandoz wrote:
>>
>> On Mar 2, 2015, at 12:07 PM, David Holmes <david.holmes at oracle.com> wrote:
>>
>>> Hi Paul,
>>>
>>> This is more a question for core-libs and the users of this Unsafe API.
>>
>> I wanted to check here first because of work done in [1] and because this is where there is most experience with the Unsafe implementation. I don't want to change the semantics of existing Unsafe methods.
>>
>> Note that the VarHandle work will expose using release/acquire names, where the former implementation defers to Unsafe.putOrdered*, and the later to relaxed plus explicit load fence.
> 
> The Unsafe API naming tends to be done by whomever is defining the 
> public API that uses it (eg. Doug Lea for j.u.c). The implementation of 
> the Unsafe API then has to map through to whatever the VM provides. So 
> given there are three layers you either match the first two or the last 
> two but you can rarely make all three the same.
> 
> So for example, j.u.c.atomic lazySet is defined as providing:
> 
>   *   <li> {@code lazySet} has the memory effects of writing (assigning)
>   *   a {@code volatile} variable except that it permits reorderings with
>   *   subsequent (but not previous) memory actions that do not themselves
>   *   impose reordering constraints with ordinary non-{@code volatile}
>   *   writes.
> 
> and is implemented by a call to Unsafe.putOrdered, which in turn is 
> implemented by doing a full volatile write, which is 
> OrderAccess::release_store_fence.

A volatile write is stronger than just a release_store_fence.

> The implementation provides a stronger barrier than what is
> required. Depending on your perspective either putOrdered captures
> the right "lazySet" semantics but happens to be implemented using
> stronger ones (and that implementation might be relaxed in the
> future); or putOrdered is really intended to be release_store_fence
> (and so could be renamed accordingly) and if you want to implement
> true lazySet semantics then you have to define a new Unsafe API to
> capture that.

> Conversely if you need release_store_fence then you either define an
> API that always provide it, or use an existing one (in this case it
> is a normal volatile field write).

Doug sez:

<< There are three basic strengths of write: Relaxed (normal),
releasing, and SC volatile. I got talked into naming the second
releasing version "lazySet" which is confusing enough, but compounded
by the almost equally odd internal unsafe name "ordered".

<< These should be less confusing in JDK9 when we provide more uniform
enhanced-volatile support. >>

Andrew.


More information about the hotspot-dev mailing list