Hi Aleksey and Hans, I implemented four variations of changes and measured performance improvement.
1) Put VarHandle.fullFence() between initialization of ClassDataSlot[] and writing the reference to non-volatile dataLayout. Webrev: http://cr.openjdk.java.net/~horii/8187033/webrev.01-fence/ 2) Use Unsafe.getObjectAcquire() and Unsafe.putObjectRelease() for reading/writing dataLayout. Webrev: http://cr.openjdk.java.net/~horii/8187033/webrev.01-unsafe/ 3) Put reference to ClassDataSlot[] into a final field of an object and store the object to non-volatile dataLayout. Every invocation of getDataLayout() reads the final field needs to deference the object pointer. Webrev: http://cr.openjdk.java.net/~horii/8187033/webrev.01-final/ 4) Put reference to ClassDataSlot[] into a final field of an object, read the final field immediately after the object creation, and store it to non-volatile dataLayout. I think this is also correct based on the semantics of final fields and data dependency. Webrev: http://cr.openjdk.java.net/~horii/8187033/webrev.01-final2/ The performance improvements were: 1) +3.5% 2) +1.1% 3) +2.2% 4) +3.4% The reason of small improvement in 2) is that the actual code of Unsafe.getObjectAcquire()/putObjectRelease() simply invokes getObjectVolatile()/putObjectVolatile() in them, respectively. If all implementations are correct, I'd like to take 4) because I want to back port this change to jdk8u but VarHandle is only available in jdk9 or later. Regards, Ogata