提交 04b6e378 编写于 作者: M mullan

6845161: Bottleneck in Configuration.getConfiguration synchronized call

Summary: Reduce scope of synchronized block
Reviewed-by: weijun
上级 848d26e6
/* /*
* Copyright 1998-2006 Sun Microsystems, Inc. All Rights Reserved. * Copyright 1998-2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -234,56 +234,58 @@ public abstract class Configuration { ...@@ -234,56 +234,58 @@ public abstract class Configuration {
* *
* @see #setConfiguration * @see #setConfiguration
*/ */
public static synchronized Configuration getConfiguration() { public static Configuration getConfiguration() {
SecurityManager sm = System.getSecurityManager(); SecurityManager sm = System.getSecurityManager();
if (sm != null) if (sm != null)
sm.checkPermission(new AuthPermission("getLoginConfiguration")); sm.checkPermission(new AuthPermission("getLoginConfiguration"));
if (configuration == null) { synchronized (Configuration.class) {
String config_class = null; if (configuration == null) {
config_class = AccessController.doPrivileged String config_class = null;
(new PrivilegedAction<String>() { config_class = AccessController.doPrivileged
public String run() { (new PrivilegedAction<String>() {
return java.security.Security.getProperty public String run() {
("login.configuration.provider"); return java.security.Security.getProperty
("login.configuration.provider");
}
});
if (config_class == null) {
config_class = "com.sun.security.auth.login.ConfigFile";
} }
});
if (config_class == null) {
config_class = "com.sun.security.auth.login.ConfigFile";
}
try { try {
final String finalClass = config_class; final String finalClass = config_class;
configuration = AccessController.doPrivileged configuration = AccessController.doPrivileged
(new PrivilegedExceptionAction<Configuration>() { (new PrivilegedExceptionAction<Configuration>() {
public Configuration run() throws ClassNotFoundException, public Configuration run() throws ClassNotFoundException,
InstantiationException, InstantiationException,
IllegalAccessException { IllegalAccessException {
return (Configuration)Class.forName return (Configuration)Class.forName
(finalClass, (finalClass,
true, true,
contextClassLoader).newInstance(); contextClassLoader).newInstance();
}
});
} catch (PrivilegedActionException e) {
Exception ee = e.getException();
if (ee instanceof InstantiationException) {
throw (SecurityException) new
SecurityException
("Configuration error:" +
ee.getCause().getMessage() +
"\n").initCause(ee.getCause());
} else {
throw (SecurityException) new
SecurityException
("Configuration error: " +
ee.toString() +
"\n").initCause(ee);
} }
});
} catch (PrivilegedActionException e) {
Exception ee = e.getException();
if (ee instanceof InstantiationException) {
throw (SecurityException) new
SecurityException
("Configuration error:" +
ee.getCause().getMessage() +
"\n").initCause(ee.getCause());
} else {
throw (SecurityException) new
SecurityException
("Configuration error: " +
ee.toString() +
"\n").initCause(ee);
} }
} }
return configuration;
} }
return configuration;
} }
/** /**
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册