diff -r e554994dd16a src/share/classes/java/lang/System.java --- a/src/share/classes/java/lang/System.java Fri Dec 13 09:36:06 2013 -0800 +++ b/src/share/classes/java/lang/System.java Wed Jan 22 11:02:33 2014 -0800 @@ -27,6 +27,9 @@ package java.lang; import java.io.*; import java.lang.reflect.Executable; import java.lang.annotation.Annotation; +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.VolatileCallSite; import java.security.AccessControlContext; import java.util.Properties; import java.util.PropertyPermission; @@ -37,6 +40,7 @@ import java.security.PrivilegedAction; import java.security.AllPermission; import java.nio.channels.Channel; import java.nio.channels.spi.SelectorProvider; + import sun.nio.ch.Interruptible; import sun.reflect.CallerSensitive; import sun.reflect.Reflection; @@ -125,7 +129,8 @@ public final class System { /* The security manager for the system. */ - private static volatile SecurityManager security = null; +// private static volatile SecurityManager security = null; + private static VolatileCallSite security; /** * Reassigns the "standard" input stream. @@ -319,7 +324,8 @@ public final class System { }); } - security = s; +// security = s; + security.setTarget(MethodHandles.constant(SecurityManager.class, s)); } /** @@ -331,7 +337,12 @@ public final class System { * @see #setSecurityManager */ public static SecurityManager getSecurityManager() { - return security; +// return security; + try { + return (SecurityManager) security.getTarget().invokeExact(); + } catch (Throwable e) { + return null; + } } /** @@ -1210,6 +1221,8 @@ public final class System { // register shared secrets setJavaLangAccess(); + security = new VolatileCallSite(MethodHandles.constant(SecurityManager.class, null)); + // Subsystems that are invoked during initialization can invoke // sun.misc.VM.isBooted() in order to avoid doing things that should // wait until the application class loader has been set up. diff -r e554994dd16a src/share/classes/java/lang/Thread.java --- a/src/share/classes/java/lang/Thread.java Fri Dec 13 09:36:06 2013 -0800 +++ b/src/share/classes/java/lang/Thread.java Wed Jan 22 11:02:33 2014 -0800 @@ -36,6 +36,8 @@ import java.util.HashMap; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import java.util.concurrent.locks.LockSupport; + +import sun.misc.VM; import sun.nio.ch.Interruptible; import sun.reflect.CallerSensitive; import sun.reflect.Reflection; @@ -367,7 +369,7 @@ class Thread implements Runnable { } Thread parent = currentThread(); - SecurityManager security = System.getSecurityManager(); + SecurityManager security = VM.isBooted() ? System.getSecurityManager() : null; if (g == null) { /* Determine if it's an applet or not */ @@ -386,7 +388,9 @@ class Thread implements Runnable { /* checkAccess regardless of whether or not threadgroup is explicitly passed in. */ - g.checkAccess(); + if (VM.isBooted()) { + g.checkAccess(); + } /* * Do we have the required permissions?