Author: pauls
Date: Thu Oct  5 07:54:30 2017
New Revision: 1811166

URL: http://svn.apache.org/viewvc?rev=1811166&view=rev
Log:
SLING-7175: Improve concurrency in FSDynamicClassLoader.

Modified:
    
sling/trunk/bundles/commons/fsclassloader/src/main/java/org/apache/sling/commons/fsclassloader/impl/FSDynamicClassLoader.java

Modified: 
sling/trunk/bundles/commons/fsclassloader/src/main/java/org/apache/sling/commons/fsclassloader/impl/FSDynamicClassLoader.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/commons/fsclassloader/src/main/java/org/apache/sling/commons/fsclassloader/impl/FSDynamicClassLoader.java?rev=1811166&r1=1811165&r2=1811166&view=diff
==============================================================================
--- 
sling/trunk/bundles/commons/fsclassloader/src/main/java/org/apache/sling/commons/fsclassloader/impl/FSDynamicClassLoader.java
 (original)
+++ 
sling/trunk/bundles/commons/fsclassloader/src/main/java/org/apache/sling/commons/fsclassloader/impl/FSDynamicClassLoader.java
 Thu Oct  5 07:54:30 2017
@@ -23,6 +23,7 @@ import java.net.URLClassLoader;
 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 @@ public class FSDynamicClassLoader
     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 @@ public class FSDynamicClassLoader
     @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);
         }
     }
 }


Reply via email to