Author: tv
Date: Tue Jan 19 10:11:23 2016
New Revision: 1725458

URL: http://svn.apache.org/viewvc?rev=1725458&view=rev
Log:
Address concurrency issues reported by Findbugs

Modified:
    
turbine/core/trunk/src/java/org/apache/turbine/services/BaseServiceBroker.java
    
turbine/core/trunk/src/java/org/apache/turbine/services/assemblerbroker/util/java/JavaBaseFactory.java

Modified: 
turbine/core/trunk/src/java/org/apache/turbine/services/BaseServiceBroker.java
URL: 
http://svn.apache.org/viewvc/turbine/core/trunk/src/java/org/apache/turbine/services/BaseServiceBroker.java?rev=1725458&r1=1725457&r2=1725458&view=diff
==============================================================================
--- 
turbine/core/trunk/src/java/org/apache/turbine/services/BaseServiceBroker.java 
(original)
+++ 
turbine/core/trunk/src/java/org/apache/turbine/services/BaseServiceBroker.java 
Tue Jan 19 10:11:23 2016
@@ -21,8 +21,6 @@ package org.apache.turbine.services;
 
 
 import java.util.ArrayList;
-import java.util.Enumeration;
-import java.util.Hashtable;
 import java.util.Iterator;
 import java.util.LinkedHashMap;
 import java.util.LinkedHashSet;
@@ -119,7 +117,7 @@ public abstract class BaseServiceBroker
     /**
      * mapping from service names to instances of TurbineServiceProviders
      */
-    private final Hashtable<String, Service> serviceProviderInstanceMap = new 
Hashtable<String, Service>();
+    private final ConcurrentHashMap<String, Service> 
serviceProviderInstanceMap = new ConcurrentHashMap<String, Service>();
 
     /**
      * Default constructor, protected as to only be usable by subclasses.
@@ -643,7 +641,11 @@ public abstract class BaseServiceBroker
                             // service provider - if so then remember it
                             if (service instanceof TurbineServiceProvider)
                             {
-                                
this.serviceProviderInstanceMap.put(name,service);
+                                Service _service = 
this.serviceProviderInstanceMap.putIfAbsent(name,service);
+                                if (_service != null)
+                                {
+                                    service = _service;
+                                }
                             }
                         }
                         // those two errors must be passed to the VM
@@ -672,7 +674,11 @@ public abstract class BaseServiceBroker
                     }
                     service.setServiceBroker(this);
                     service.setName(name);
-                    services.put(name, service);
+                    Service _service = services.putIfAbsent(name, service);
+                    if (_service != null) // Unlikely
+                    {
+                        service = _service;
+                    }
                 }
             }
             finally
@@ -740,14 +746,11 @@ public abstract class BaseServiceBroker
      */
     protected boolean isNonLocalService(String name)
     {
-        String serviceName = null;
         TurbineServiceProvider turbineServiceProvider = null;
-        Enumeration<String> list = this.serviceProviderInstanceMap.keys();
 
-        while (list.hasMoreElements())
+        for (Map.Entry<String, Service> entry : 
this.serviceProviderInstanceMap.entrySet())
         {
-            serviceName = list.nextElement();
-            turbineServiceProvider = (TurbineServiceProvider) 
this.getService(serviceName);
+            turbineServiceProvider = (TurbineServiceProvider) 
this.getService(entry.getKey());
 
             if (turbineServiceProvider.exists(name))
             {
@@ -768,14 +771,11 @@ public abstract class BaseServiceBroker
     protected Object getNonLocalService(String name)
        throws InstantiationException
     {
-        String serviceName = null;
         TurbineServiceProvider turbineServiceProvider = null;
-        Enumeration<String> list = this.serviceProviderInstanceMap.keys();
 
-        while (list.hasMoreElements())
+        for (Map.Entry<String, Service> entry : 
this.serviceProviderInstanceMap.entrySet())
         {
-            serviceName = list.nextElement();
-            turbineServiceProvider = (TurbineServiceProvider) 
this.getService(serviceName);
+            turbineServiceProvider = (TurbineServiceProvider) 
this.getService(entry.getKey());
 
             if (turbineServiceProvider.exists(name))
             {

Modified: 
turbine/core/trunk/src/java/org/apache/turbine/services/assemblerbroker/util/java/JavaBaseFactory.java
URL: 
http://svn.apache.org/viewvc/turbine/core/trunk/src/java/org/apache/turbine/services/assemblerbroker/util/java/JavaBaseFactory.java?rev=1725458&r1=1725457&r2=1725458&view=diff
==============================================================================
--- 
turbine/core/trunk/src/java/org/apache/turbine/services/assemblerbroker/util/java/JavaBaseFactory.java
 (original)
+++ 
turbine/core/trunk/src/java/org/apache/turbine/services/assemblerbroker/util/java/JavaBaseFactory.java
 Tue Jan 19 10:11:23 2016
@@ -22,7 +22,6 @@ package org.apache.turbine.services.asse
 
 import java.util.List;
 import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.locks.ReentrantLock;
 
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.logging.Log;
@@ -56,11 +55,6 @@ public abstract class JavaBaseFactory<T
     private final ConcurrentHashMap<String, Class<T>> classCache = new 
ConcurrentHashMap<String, Class<T>>();
 
     /**
-     * Lock for cache update
-     */
-    private final ReentrantLock lock = new ReentrantLock();
-
-    /**
      * Get an Assembler.
      *
      * @param packageName java package name
@@ -96,22 +90,11 @@ public abstract class JavaBaseFactory<T
                     Class<T> servClass = classCache.get(className);
                     if (servClass == null)
                     {
-                        lock.lock();
-
-                        try
-                        {
-                            // Double check
-                            servClass = classCache.get(className);
-
-                            if (servClass == null)
-                            {
-                                servClass = (Class<T>) 
Class.forName(className);
-                                classCache.put(className, servClass);
-                            }
-                        }
-                        finally
+                        servClass = (Class<T>) Class.forName(className);
+                        Class<T> _servClass = 
classCache.putIfAbsent(className, servClass);
+                        if (_servClass != null)
                         {
-                            lock.unlock();
+                            servClass = _servClass;
                         }
                     }
                     assembler = servClass.newInstance();


Reply via email to