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);
         }
     }
 }