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