--- old/src/share/classes/java/math/BigInteger.java 2011-09-06 06:14:04.000000000 -0700 +++ new/src/share/classes/java/math/BigInteger.java 2011-09-06 06:14:03.000000000 -0700 @@ -3303,25 +3303,35 @@ } // 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 final long signumOffset; - private static final long magOffset; - static { - try { - signumOffset = unsafe.objectFieldOffset - (BigInteger.class.getDeclaredField("signum")); - magOffset = unsafe.objectFieldOffset - (BigInteger.class.getDeclaredField("mag")); - } catch (Exception ex) { - throw new Error(ex); + 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 ExceptionInInitializerError(ex); + } + } + + static void putSign(BigInteger bi, int sign) { + unsafe.putIntVolatile(bi, signumOffset, sign); + } + + static void putMag(BigInteger bi, int[] magnitude) { + unsafe.putObjectVolatile(bi, magOffset, magnitude); } }