From 04b6e3788bc18b0a031471b208af77f44221aac8 Mon Sep 17 00:00:00 2001 From: mullan Date: Wed, 10 Jun 2009 09:12:15 -0700 Subject: [PATCH] 6845161: Bottleneck in Configuration.getConfiguration synchronized call Summary: Reduce scope of synchronized block Reviewed-by: weijun --- .../security/auth/login/Configuration.java | 82 ++++++++++--------- 1 file changed, 42 insertions(+), 40 deletions(-) diff --git a/src/share/classes/javax/security/auth/login/Configuration.java b/src/share/classes/javax/security/auth/login/Configuration.java index 3cc2d4a81..0b1c165c5 100644 --- a/src/share/classes/javax/security/auth/login/Configuration.java +++ b/src/share/classes/javax/security/auth/login/Configuration.java @@ -1,5 +1,5 @@ /* - * 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. * * This code is free software; you can redistribute it and/or modify it @@ -234,56 +234,58 @@ public abstract class Configuration { * * @see #setConfiguration */ - public static synchronized Configuration getConfiguration() { + public static Configuration getConfiguration() { SecurityManager sm = System.getSecurityManager(); if (sm != null) sm.checkPermission(new AuthPermission("getLoginConfiguration")); - if (configuration == null) { - String config_class = null; - config_class = AccessController.doPrivileged - (new PrivilegedAction() { - public String run() { - return java.security.Security.getProperty - ("login.configuration.provider"); + synchronized (Configuration.class) { + if (configuration == null) { + String config_class = null; + config_class = AccessController.doPrivileged + (new PrivilegedAction() { + public String run() { + 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 { - final String finalClass = config_class; - configuration = AccessController.doPrivileged - (new PrivilegedExceptionAction() { - public Configuration run() throws ClassNotFoundException, - InstantiationException, - IllegalAccessException { - return (Configuration)Class.forName - (finalClass, - true, - contextClassLoader).newInstance(); + try { + final String finalClass = config_class; + configuration = AccessController.doPrivileged + (new PrivilegedExceptionAction() { + public Configuration run() throws ClassNotFoundException, + InstantiationException, + IllegalAccessException { + return (Configuration)Class.forName + (finalClass, + true, + 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; } /** -- GitLab