--- jsr166/src/jsr166e/extra/AtomicDoubleArray.java 2011/10/25 19:21:27 1.4 +++ jsr166/src/jsr166e/extra/AtomicDoubleArray.java 2013/03/04 16:09:25 1.9 @@ -14,7 +14,7 @@ import static java.lang.Double.longBitsT * See the {@link java.util.concurrent.atomic} package specification * for description of the properties of atomic variables. * - *

This class compares primitive {@code double} + *

This class compares primitive {@code double} * values in methods such as {@link #compareAndSet} by comparing their * bitwise representation using {@link Double#doubleToRawLongBits}, * which differs from both the primitive double {@code ==} operator @@ -162,11 +162,11 @@ public class AtomicDoubleArray implement * if the current value is bitwise equal * to the expected value. * - *

May - * fail spuriously - * and does not provide ordering guarantees, so is only rarely an - * appropriate alternative to {@code compareAndSet}. + + * May fail spuriously and does not provide ordering guarantees, + * so is only rarely an appropriate alternative to {@code compareAndSet}. * * @param i the index * @param expect the expected value @@ -242,7 +242,7 @@ public class AtomicDoubleArray implement * of its elements (each a {@code double}) in the proper order. */ private void writeObject(java.io.ObjectOutputStream s) - throws java.io.IOException{ + throws java.io.IOException { s.defaultWriteObject(); // Write out array length @@ -300,21 +300,23 @@ public class AtomicDoubleArray implement private static sun.misc.Unsafe getUnsafe() { try { return sun.misc.Unsafe.getUnsafe(); - } catch (SecurityException se) { - try { - return java.security.AccessController.doPrivileged - (new java.security - .PrivilegedExceptionAction() { - public sun.misc.Unsafe run() throws Exception { - java.lang.reflect.Field f = sun.misc - .Unsafe.class.getDeclaredField("theUnsafe"); - f.setAccessible(true); - return (sun.misc.Unsafe) f.get(null); - }}); - } catch (java.security.PrivilegedActionException e) { - throw new RuntimeException("Could not initialize intrinsics", - e.getCause()); - } + } catch (SecurityException tryReflectionInstead) {} + try { + return java.security.AccessController.doPrivileged + (new java.security.PrivilegedExceptionAction() { + public sun.misc.Unsafe run() throws Exception { + Class k = sun.misc.Unsafe.class; + for (java.lang.reflect.Field f : k.getDeclaredFields()) { + f.setAccessible(true); + Object x = f.get(null); + if (k.isInstance(x)) + return k.cast(x); + } + throw new NoSuchFieldError("the Unsafe"); + }}); + } catch (java.security.PrivilegedActionException e) { + throw new RuntimeException("Could not initialize intrinsics", + e.getCause()); } } }