On 08/31/2017 09:39 PM, Hans Boehm wrote:
>> I guess you can make VarHandle.fullFence() between getClassDataLayout0() and 
>> storing it to the 
>> non-volatile field...
> 
> ... with the usual warning about this sort of thing:
> 
> According to the JMM, it's not guaranteed to work, because the reader-side 
> guarantees are not
> there. In practice, you're relying on dependency-based ordering, which the 
> compiler is currently
> unlikely to break in this case. But future implementations may.

Right.

> I presume the real concern here is the cost on the reader side? Presumably 
> that could be reduced 
> with a VarHandle getAcquire(). I believe that eliminates the heavy-weight 
> sync, and just keeps
> an lwsync. Imperfect, but better.
Oh right! This is exactly why acq/rel exist. Since OSC is a heavily used class, 
the Unsafe
counterparts might be better:

private static final Unsafe U = ...;
private static final long CDS_OFFSET = U.objectFieldOffset(...);

private volatile ClassDataSlot[] dataLayout; // volatile for safety of naked 
reads

ClassDataSlot[] getClassDataLayout() throws InvalidClassException {
  ClassDataSlot[] slots = U.getObjectAcquire(this, CDS_OFFSET);
  if (slots == null) {
    slots = getClassDataLayout0();
    U.putObjectRelease(this, CDS_OFFSET, slots);
  }
  return slots;
}

Ogata, please try if that indeed helps on POWER?

Thanks,
-Aleksey

Reply via email to