SLING-7175: Improve concurrency in FSDynamicClassLoader.
git-svn-id: https://svn.apache.org/repos/asf/sling/trunk@1811166 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/src/main/java/org/apache/sling/commons/fsclassloader/impl/FSDynamicClassLoader.java b/src/main/java/org/apache/sling/commons/fsclassloader/impl/FSDynamicClassLoader.java
index d35ae3d..90fe699 100644
--- a/src/main/java/org/apache/sling/commons/fsclassloader/impl/FSDynamicClassLoader.java
+++ b/src/main/java/org/apache/sling/commons/fsclassloader/impl/FSDynamicClassLoader.java
@@ -23,6 +23,7 @@
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
import org.apache.sling.commons.classloader.DynamicClassLoader;
@@ -30,10 +31,9 @@
extends URLClassLoader
implements DynamicClassLoader {
- private boolean isDirty = false;
+ private volatile boolean isDirty = false;
- private final Set<String> hit = Collections.synchronizedSet(new HashSet<String>());
- private final Set<String> miss = Collections.synchronizedSet(new HashSet<String>());
+ private final Set<String> loads = Collections.newSetFromMap(new ConcurrentHashMap<String, Boolean>());
private final DynamicClassLoader parentLoader;
@@ -55,18 +55,15 @@
@Override
public Class<?> loadClass(final String name) throws ClassNotFoundException {
try {
- final Class<?> c = super.loadClass(name);
- this.hit.add(name);
- return c;
- } catch (final ClassNotFoundException cnfe) {
- this.miss.add(name);
- throw cnfe;
+ return super.loadClass(name);
+ } finally {
+ this.loads.add(name);
}
}
public void check(final String className) {
if ( !this.isDirty ) {
- this.isDirty = hit.contains(className) || miss.contains(className);
+ this.isDirty = loads.contains(className);
}
}
}