You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-dev@axis.apache.org by sc...@apache.org on 2007/12/11 18:02:35 UTC

svn commit: r603300 - /webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/registry/FactoryRegistry.java

Author: scheu
Date: Tue Dec 11 09:02:32 2007
New Revision: 603300

URL: http://svn.apache.org/viewvc?rev=603300&view=rev
Log:
AXIS2-3399
Contributor: David Strite and Rich Scheuerle
Changed the FactoryRegistry to use a "copy on put" approach.
This improves the performance by eliminating synchronization on gets.

Modified:
    webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/registry/FactoryRegistry.java

Modified: webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/registry/FactoryRegistry.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/registry/FactoryRegistry.java?rev=603300&r1=603299&r2=603300&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/registry/FactoryRegistry.java (original)
+++ webservices/axis2/trunk/java/modules/jaxws/src/org/apache/axis2/jaxws/registry/FactoryRegistry.java Tue Dec 11 09:02:32 2007
@@ -45,16 +45,36 @@
 import org.apache.axis2.jaxws.utility.ExecutorFactory;
 import org.apache.axis2.jaxws.utility.JAXWSExecutorFactory;
 
-import java.util.Hashtable;
+import java.util.HashMap;
 import java.util.Map;
 
-/** FactoryRegistry Registry containing Factories related to the JAX-WS Implementation */
+/** 
+ * FactoryRegistry Registry containing Factories related to the JAX-WS Implementation.
+ * The expected scenario is:
+ *   1) Most or all of the factories are registered during startup.
+ *   2) There are a large number of getFactory calls
+ *   3) There may be an infrequent call to setFactory.
+ *   
+ * Thus a "copy on put" approach is used.  This ensures that the "gets" are 
+ * fast (because they are unsynchronized).  The "puts" are slower because they
+ * create a new copy of the HashMap.
+ * See http://www.ibm.com/developerworks/java/library/j-hashmap.html
+ **/
 public class FactoryRegistry {
 
-    private final static Map<Class, Object> table;
-
+    private static volatile Map<Class, Object> table;
+    private static Object lockbox = new Object();
+    
     static {
-        table = new Hashtable<Class, Object>();
+        init();
+    }
+    
+    private static final void init() {
+        
+        // An unsynchronized Map is used to ensure that gets are fast.
+        table = new HashMap<Class, Object>();
+        
+        // Load Factories
         table.put(XMLStringBlockFactory.class, new XMLStringBlockFactoryImpl());
         table.put(EndpointDispatcherFactory.class, new EndpointDispatcherFactoryImpl());
         table.put(JAXBBlockFactory.class, new JAXBBlockFactoryImpl());
@@ -76,21 +96,26 @@
     }
 
     /**
-     * getFactory
-     *
+     * Get the factory.  This may be called frequently.
      * @param intface of the Factory
      * @return Object that is the factory implementation for the intface
      */
     public static Object getFactory(Class intface) {
-        return table.get(intface);
+        Map m = table;
+        return m.get(intface);
     }
 
     /**
-     * setFactory
+     * Add the factory.  This should be called infrequently.
      * @param intface
      * @param factoryObject
      */
     public static void setFactory(Class intface, Object factoryObject) {
-        table.put(intface, factoryObject);
+        synchronized(lockbox) {
+            // Use copy and put approach to ensure that "get" speed is fast.
+            Map<Class, Object> newMap = new HashMap<Class, Object>(table);
+            newMap.put(intface, factoryObject);
+            table = newMap;
+        }
     }
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: axis-cvs-unsubscribe@ws.apache.org
For additional commands, e-mail: axis-cvs-help@ws.apache.org