Merge pull request #5267 from eatkins/zombie-concurrency

Make ZombieClassLoader thread safe
This commit is contained in:
eugene yokota 2019-12-04 18:57:50 -05:00 committed by GitHub
commit 47985e33ae
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 11 additions and 3 deletions

View File

@ -39,13 +39,16 @@ abstract class ManagedClassLoader extends URLClassLoader implements NativeLoader
private final URL[] urls;
ZombieClassLoader(URL[] urls) {
super(urls, ManagedClassLoader.this);
super(urls, ManagedClassLoader.this.getParent());
this.urls = urls;
}
Class<?> lookupClass(final String name) throws ClassNotFoundException {
try {
return findClass(name);
synchronized (getClassLoadingLock(name)) {
final Class<?> previous = findLoadedClass(name);
return previous != null ? previous : findClass(name);
}
} catch (final ClassNotFoundException e) {
final StringBuilder builder = new StringBuilder();
for (final URL u : urls) {
@ -89,7 +92,12 @@ abstract class ManagedClassLoader extends URLClassLoader implements NativeLoader
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException {
return closed.get() ? getZombieLoader(name).lookupClass(name) : super.findClass(name);
try {
return super.findClass(name);
} catch (final NoClassDefFoundError | ClassNotFoundException e) {
if (closed.get()) return getZombieLoader(name).lookupClass(name);
else throw e;
}
}
@Override