< prev index next >
src/java.base/share/classes/java/io/ObjectStreamClass.java
Print this page
@@ -1183,23 +1183,41 @@
this.desc = desc;
this.hasData = hasData;
}
}
+ private static final Unsafe U = Unsafe.getUnsafe();
+ private static final long CDS_OFFSET;
+
+ static {
+ Field field = null;
+ try {
+ field = ObjectStreamClass.class.getDeclaredField("dataLayout");
+ } catch(NoSuchFieldException | SecurityException e) {
+ }
+ if(field == null) {
+ CDS_OFFSET = Unsafe.INVALID_FIELD_OFFSET;
+ } else {
+ CDS_OFFSET = U.objectFieldOffset(field);
+ }
+ }
+
/**
* Returns array of ClassDataSlot instances representing the data layout
* (including superclass data) for serialized objects described by this
* class descriptor. ClassDataSlots are ordered by inheritance with those
* containing "higher" superclasses appearing first. The final
* ClassDataSlot contains a reference to this descriptor.
*/
ClassDataSlot[] getClassDataLayout() throws InvalidClassException {
// REMIND: synchronize instead of relying on volatile?
- if (dataLayout == null) {
- dataLayout = getClassDataLayout0();
+ ClassDataSlot[] slots = (ClassDataSlot[])U.getObjectAcquire(this, CDS_OFFSET);
+ if (slots == null) {
+ slots = getClassDataLayout0();
+ U.putObjectRelease(this, CDS_OFFSET, slots);
}
- return dataLayout;
+ return slots;
}
private ClassDataSlot[] getClassDataLayout0()
throws InvalidClassException
{
< prev index next >