On 2014-11-02, at 10:49 PM, David Holmes <david.hol...@oracle.com> wrote:
>> The change is to load the volatile size for the loop bound; this stops the 
>> stores
>> in the loop from moving earlier, right?
> 
> Treating volatile accesses like memory barriers is playing a bit 
> fast-and-loose with the spec+implementation. The basic happens-before 
> relationship for volatiles states that if a volatile read sees a value X, 
> then the volatile write that wrote X happened-before the read [1]. But in 
> this code there are no checks of the values of the volatile fields. Instead 
> you are relying on a volatile read "acting like acquire()" and a volatile 
> write "acting like release()".
> 
> That said you are trying to "synchronize" the hotspot code with the JDK code 
> so you have stepped outside the JMM in any case and reasoning about what is 
> and is not allowed is somewhat moot - unless the hotspot code always uses 
> Java-style accesses to the Java-level variables.

My main concern is that the compiler is inhibited from any peculiar code 
motion; I assume that taking a safe point has a bit of barrier built into it 
anyway, especially given that the worry case is safepoint + JVMTI.

Given the worry, what’s the best way to spell “barrier” here?
I could synchronize on classData (it would be a recursive lock in the current 
version of the code)
  synchronized (this) { size++; }
or I could synchronize on elementData (no longer used for a lock elsewhere, so 
always uncontended)
  synchronized (elementData) { size++; }
or is there some Unsafe thing that would be better?

(core-libs-dev — there will be another webrev coming.  This is a runtime+jdk 
patch.)

David

> BTW the Java side of this needs to be reviewed on 
> core-libs-dev@openjdk.java.net
> 
> David H.
> 
> [1] http://docs.oracle.com/javase/specs/jls/se8/html/jls-17.html#jls-17.4.4
> 
> 
>> David

Reply via email to