Author: markt Date: Tue Sep 8 13:27:12 2015 New Revision: 1701802 URL: http://svn.apache.org/r1701802 Log: More preparation for implementing parallel class loading. Make WebappClassLoaderBase parallel capable when running on a Java 7+ JRE
Modified: tomcat/tc7.0.x/trunk/java/org/apache/catalina/loader/WebappClassLoaderBase.java Modified: tomcat/tc7.0.x/trunk/java/org/apache/catalina/loader/WebappClassLoaderBase.java URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/catalina/loader/WebappClassLoaderBase.java?rev=1701802&r1=1701801&r2=1701802&view=diff ============================================================================== --- tomcat/tc7.0.x/trunk/java/org/apache/catalina/loader/WebappClassLoaderBase.java (original) +++ tomcat/tc7.0.x/trunk/java/org/apache/catalina/loader/WebappClassLoaderBase.java Tue Sep 8 13:27:12 2015 @@ -82,6 +82,7 @@ import org.apache.naming.resources.Resou import org.apache.tomcat.InstrumentableClassLoader; import org.apache.tomcat.util.ExceptionUtils; import org.apache.tomcat.util.IntrospectionUtils; +import org.apache.tomcat.util.compat.JreCompat; import org.apache.tomcat.util.compat.JreVendor; import org.apache.tomcat.util.res.StringManager; @@ -153,11 +154,37 @@ public abstract class WebappClassLoaderB private static final Manifest MANIFEST_UNKNOWN = new Manifest(); + private static final Method GET_CLASSLOADING_LOCK_METHOD; + + protected static final StringManager sm = StringManager.getManager(Constants.Package); + static { + // Register this base class loader as parallel capable on Java 7+ JREs + Method getClassLoadingLockMethod = null; + try { + if (JreCompat.isJre7Available()) { + final Method registerParallel = + ClassLoader.class.getDeclaredMethod("registerAsParallelCapable"); + AccessController.doPrivileged(new PrivilegedAction<Void>() { + @Override + public Void run() { + registerParallel.setAccessible(true); + return null; + } + }); + registerParallel.invoke(null); + getClassLoadingLockMethod = + ClassLoader.class.getDeclaredMethod("getClassLoadingLock", String.class); + } + } catch (Exception e) { + // ignore + } + GET_CLASSLOADING_LOCK_METHOD = getClassLoadingLockMethod; JVM_THREAD_GROUP_NAMES.add(JVM_THREAD_GROUP_SYSTEM); JVM_THREAD_GROUP_NAMES.add("RMI Runtime"); } + protected class PrivilegedFindResourceByName implements PrivilegedAction<ResourceEntry> { @@ -220,13 +247,6 @@ public abstract class WebappClassLoaderB /** - * The string manager for this package. - */ - protected static final StringManager sm = - StringManager.getManager(Constants.Package); - - - /** * Use anti JAR locking code, which does URL rerouting when accessing * resources. */ @@ -1710,10 +1730,11 @@ public abstract class WebappClassLoaderB * * @exception ClassNotFoundException if the class was not found */ + @SuppressWarnings("sync-override") @Override public Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException { - synchronized (this) { + synchronized (getClassLoadingLockInternal(name)) { if (log.isDebugEnabled()) log.debug("loadClass(" + name + ", " + resolve + ")"); Class<?> clazz = null; @@ -1834,6 +1855,18 @@ public abstract class WebappClassLoaderB } + private Object getClassLoadingLockInternal(String className) { + if (JreCompat.isJre7Available() && GET_CLASSLOADING_LOCK_METHOD != null) { + try { + return GET_CLASSLOADING_LOCK_METHOD.invoke(this, className); + } catch (Exception e) { + // ignore + } + } + return this; + } + + /** * Get the Permissions for a CodeSource. If this instance * of WebappClassLoaderBase is for a web application context, @@ -3023,7 +3056,7 @@ public abstract class WebappClassLoaderB if (clazz != null) return clazz; - synchronized (this) { + synchronized (getClassLoadingLockInternal(name)) { clazz = entry.loadedClass; if (clazz != null) return clazz; --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org