< prev index next >

src/java.base/share/classes/java/io/ObjectStreamClass.java

Print this page

        

@@ -170,11 +170,11 @@
     /** number of non-primitive fields */
     private int numObjFields;
     /** reflector for setting/getting serializable field values */
     private FieldReflector fieldRefl;
     /** data layout of serialized objects described by this class desc */
-    private volatile ClassDataSlot[] dataLayout;
+    private ClassDataSlot[] dataLayout;
 
     /** serialization-appropriate constructor, or null if none */
     private Constructor<?> cons;
     /** class-defined writeObject method, or null if none */
     private Method writeObjectMethod;

@@ -1184,20 +1184,32 @@
             this.hasData = hasData;
         }
     }
 
     /**
+     * Class to ensure elements of ClassDataSlot[] are visible to other
+     * threads. The "final" qualifier of the variable slots is necessary.
+     */
+    private static class DataLayout {
+        final ClassDataSlot[]  slots;
+        DataLayout(ClassDataSlot[] s) {
+            slots = s;
+        }
+    }
+
+    /**
      * 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 = getClassDataLayout0();
+            dataLayout = new DataLayout(slots).slots;
         }
         return dataLayout;
     }
 
     private ClassDataSlot[] getClassDataLayout0()
< prev index next >