From 54625cc2a06b89018decac5507d8ba719dd0aa8a Mon Sep 17 00:00:00 2001 From: Phillip Webb Date: Mon, 18 Aug 2014 20:08:03 -0700 Subject: [PATCH] Make LaunchedURLClassLoader lock provider static Fixes gh-1380 --- .../boot/loader/LaunchedURLClassLoader.java | 34 +++++++------------ 1 file changed, 12 insertions(+), 22 deletions(-) diff --git a/spring-boot-tools/spring-boot-loader/src/main/java/org/springframework/boot/loader/LaunchedURLClassLoader.java b/spring-boot-tools/spring-boot-loader/src/main/java/org/springframework/boot/loader/LaunchedURLClassLoader.java index cdaabe15a1..48b76904d9 100644 --- a/spring-boot-tools/spring-boot-loader/src/main/java/org/springframework/boot/loader/LaunchedURLClassLoader.java +++ b/spring-boot-tools/spring-boot-loader/src/main/java/org/springframework/boot/loader/LaunchedURLClassLoader.java @@ -36,19 +36,10 @@ import org.springframework.boot.loader.jar.JarFile; */ public class LaunchedURLClassLoader extends URLClassLoader { - static { - try { - ClassLoader.registerAsParallelCapable(); - } - catch (NoSuchMethodError ex) { - // Not available on earlier JDKs - } - } + private static LockProvider LOCK_PROVIDER = setupLockProvider(); private final ClassLoader rootClassLoader; - private final LockProvider lockProvider; - /** * Create a new {@link LaunchedURLClassLoader} instance. * @param urls the URLs from which to load classes and resources @@ -57,17 +48,6 @@ public class LaunchedURLClassLoader extends URLClassLoader { public LaunchedURLClassLoader(URL[] urls, ClassLoader parent) { super(urls, parent); this.rootClassLoader = findRootClassLoader(parent); - this.lockProvider = createLockProvider(); - } - - private LockProvider createLockProvider() { - try { - ClassLoader.class.getMethod("getClassLoadingLock", String.class); - return new Java7LockProvider(); - } - catch (NoSuchMethodException ex) { - return new LockProvider(); - } } private ClassLoader findRootClassLoader(ClassLoader classLoader) { @@ -148,7 +128,7 @@ public class LaunchedURLClassLoader extends URLClassLoader { @Override protected Class loadClass(String name, boolean resolve) throws ClassNotFoundException { - synchronized (this.lockProvider.getLock(this, name)) { + synchronized (LaunchedURLClassLoader.LOCK_PROVIDER.getLock(this, name)) { Class loadedClass = findLoadedClass(name); if (loadedClass == null) { Handler.setUseFastConnectionExceptions(true); @@ -244,6 +224,16 @@ public class LaunchedURLClassLoader extends URLClassLoader { } } + private static LockProvider setupLockProvider() { + try { + ClassLoader.registerAsParallelCapable(); + return new Java7LockProvider(); + } + catch (NoSuchMethodError ex) { + return new LockProvider(); + } + } + /** * Strategy used to provide the synchronize lock object to use when loading classes. */