You are viewing a plain text version of this content. The canonical link for it is here.
Posted to xbean-scm@geronimo.apache.org by gn...@apache.org on 2012/06/07 14:53:45 UTC

svn commit: r1347593 - /geronimo/xbean/trunk/xbean-classloader/src/main/java/org/apache/xbean/classloader/MultiParentClassLoader.java

Author: gnodet
Date: Thu Jun  7 12:53:45 2012
New Revision: 1347593

URL: http://svn.apache.org/viewvc?rev=1347593&view=rev
Log:
[XBEAN-203] Performance improvement by adding local cache for MultiParentClassLoader#loadClass

Modified:
    geronimo/xbean/trunk/xbean-classloader/src/main/java/org/apache/xbean/classloader/MultiParentClassLoader.java

Modified: geronimo/xbean/trunk/xbean-classloader/src/main/java/org/apache/xbean/classloader/MultiParentClassLoader.java
URL: http://svn.apache.org/viewvc/geronimo/xbean/trunk/xbean-classloader/src/main/java/org/apache/xbean/classloader/MultiParentClassLoader.java?rev=1347593&r1=1347592&r2=1347593&view=diff
==============================================================================
--- geronimo/xbean/trunk/xbean-classloader/src/main/java/org/apache/xbean/classloader/MultiParentClassLoader.java (original)
+++ geronimo/xbean/trunk/xbean-classloader/src/main/java/org/apache/xbean/classloader/MultiParentClassLoader.java Thu Jun  7 12:53:45 2012
@@ -17,6 +17,7 @@
 package org.apache.xbean.classloader;
 
 import java.io.IOException;
+import java.lang.ref.SoftReference;
 import java.net.URL;
 import java.net.URLStreamHandlerFactory;
 import java.util.ArrayList;
@@ -25,6 +26,8 @@ import java.util.Collection;
 import java.util.Collections;
 import java.util.Enumeration;
 import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
 
 /**
  * A MultiParentClassLoader is a simple extension of the URLClassLoader that simply changes the single parent class
@@ -44,6 +47,7 @@ public class MultiParentClassLoader exte
     private final String[] nonOverridableClasses;
     private final String[] hiddenResources;
     private final String[] nonOverridableResources;
+    private final Map<String, SoftReference<Class>> cache = new ConcurrentHashMap<String, SoftReference<Class>>();
 
     /**
      * Creates a named class loader with no parents.
@@ -154,7 +158,25 @@ public class MultiParentClassLoader exte
     /**
      * {@inheritDoc}
      */
-    protected synchronized Class loadClass(String name, boolean resolve) throws ClassNotFoundException {
+    protected Class loadClass(String name, boolean resolve) throws ClassNotFoundException {
+        Class result = null;
+
+        //
+        // check if the class is already in the local cache
+        //
+        SoftReference<Class> reference = cache.get(name);
+		if (reference != null) {
+            result = reference.get();
+		}
+        if (result == null) {
+            result = doLoadClass(name, resolve);
+            cache.put(name, new SoftReference<Class>(result));
+        }
+
+        return result;
+    }
+
+    private synchronized Class doLoadClass(String name, boolean resolve) throws ClassNotFoundException {
         //
         // Check if class is in the loaded classes cache
         //