src/share/classes/java/math/BigInteger.java

Print this page

        

@@ -3301,29 +3301,39 @@
                 message = "BigInteger: Magnitude not present in stream";
             throw new java.io.StreamCorruptedException(message);
         }
 
         // Commit final fields via Unsafe
-        unsafe.putIntVolatile(this, signumOffset, sign);
+        UnsafeHolder.putSign(this, sign);
 
         // Calculate mag field from magnitude and discard magnitude
-        unsafe.putObjectVolatile(this, magOffset,
-                                 stripLeadingZeroBytes(magnitude));
+        UnsafeHolder.putMag(this, stripLeadingZeroBytes(magnitude));
     }
 
     // Support for resetting final fields while deserializing
-    private static final sun.misc.Unsafe unsafe = sun.misc.Unsafe.getUnsafe();
+    private static class UnsafeHolder {
+        private static final sun.misc.Unsafe unsafe;
     private static final long signumOffset;
     private static final long magOffset;
     static {
         try {
+                unsafe = sun.misc.Unsafe.getUnsafe();
             signumOffset = unsafe.objectFieldOffset
                 (BigInteger.class.getDeclaredField("signum"));
             magOffset = unsafe.objectFieldOffset
                 (BigInteger.class.getDeclaredField("mag"));
         } catch (Exception ex) {
-            throw new Error(ex);
+                throw new ExceptionInInitializerError(ex);
+            }
+        }
+
+        private static void putSign(BigInteger bi, int sign) {
+            unsafe.putIntVolatile(bi, signumOffset, sign);
+        }
+
+        private static void putMag(BigInteger bi, int[] magnitude) {
+            unsafe.putObjectVolatile(bi, magOffset, magnitude);
         }
     }
 
     /**
      * Save the {@code BigInteger} instance to a stream.