Author: rgoers
Date: Sat Jun  2 19:08:54 2012
New Revision: 1345558

URL: http://svn.apache.org/viewvc?rev=1345558&view=rev
Log:
Use Java 5 to reduce thread contention

Modified:
    
commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/DynamicCombinedConfiguration.java

Modified: 
commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/DynamicCombinedConfiguration.java
URL: 
http://svn.apache.org/viewvc/commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/DynamicCombinedConfiguration.java?rev=1345558&r1=1345557&r2=1345558&view=diff
==============================================================================
--- 
commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/DynamicCombinedConfiguration.java
 (original)
+++ 
commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/DynamicCombinedConfiguration.java
 Sat Jun  2 19:08:54 2012
@@ -26,6 +26,8 @@ import java.util.List;
 import java.util.Map;
 import java.util.Properties;
 import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
 
 import org.apache.commons.configuration.event.ConfigurationErrorListener;
 import org.apache.commons.configuration.event.ConfigurationListener;
@@ -62,8 +64,8 @@ public class DynamicCombinedConfiguratio
     };
 
     /** The CombinedConfigurations */
-    private Map<String, CombinedConfiguration> configs =
-            new HashMap<String, CombinedConfiguration>();
+    private final ConcurrentMap<String, CombinedConfiguration> configs =
+            new ConcurrentHashMap<String, CombinedConfiguration>();
 
     /** Stores a list with the contained configurations. */
     private List<ConfigData> configurations = new ArrayList<ConfigData>();
@@ -823,41 +825,44 @@ public class DynamicCombinedConfiguratio
     private CombinedConfiguration getCurrentConfig()
     {
         String key = localSubst.replace(keyPattern);
-        CombinedConfiguration config;
-        synchronized (getNodeCombiner())
+        CombinedConfiguration config = configs.get(key);
+        // The double-checked works here due to the Thread guarantees of 
ConcurrentMap.
+        if (config == null)
         {
-            config = configs.get(key);
-            if (config == null)
+            synchronized(configs)
             {
-                config = new CombinedConfiguration(getNodeCombiner());
-                if (loggerName != null)
+                config = configs.get(key);
+                if (config == null)
                 {
-                    Log log = LogFactory.getLog(loggerName);
-                    if (log != null)
+                    config = new CombinedConfiguration(getNodeCombiner());
+                    if (loggerName != null)
                     {
-                        config.setLogger(log);
+                        Log log = LogFactory.getLog(loggerName);
+                        if (log != null)
+                        {
+                            config.setLogger(log);
+                        }
                     }
+                    
config.setIgnoreReloadExceptions(isIgnoreReloadExceptions());
+                    config.setExpressionEngine(this.getExpressionEngine());
+                    
config.setDelimiterParsingDisabled(isDelimiterParsingDisabled());
+                    
config.setConversionExpressionEngine(getConversionExpressionEngine());
+                    config.setListDelimiter(getListDelimiter());
+                    for (ConfigurationErrorListener listener : 
getErrorListeners())
+                    {
+                        config.addErrorListener(listener);
+                    }
+                    for (ConfigurationListener listener : 
getConfigurationListeners())
+                    {
+                        config.addConfigurationListener(listener);
+                    }
+                    config.setForceReloadCheck(isForceReloadCheck());
+                    for (ConfigData data : configurations)
+                    {
+                        config.addConfiguration(data.getConfiguration(), 
data.getName(), data.getAt());
+                    }
+                    configs.put(key, config);
                 }
-                config.setIgnoreReloadExceptions(isIgnoreReloadExceptions());
-                config.setExpressionEngine(this.getExpressionEngine());
-                
config.setDelimiterParsingDisabled(isDelimiterParsingDisabled());
-                
config.setConversionExpressionEngine(getConversionExpressionEngine());
-                config.setListDelimiter(getListDelimiter());
-                for (ConfigurationErrorListener listener : getErrorListeners())
-                {
-                    config.addErrorListener(listener);
-                }
-                for (ConfigurationListener listener : 
getConfigurationListeners())
-                {
-                    config.addConfigurationListener(listener);
-                }
-                config.setForceReloadCheck(isForceReloadCheck());
-                for (ConfigData data : configurations)
-                {
-                    config.addConfiguration(data.getConfiguration(), 
data.getName(),
-                            data.getAt());
-                }
-                configs.put(key, config);
             }
         }
         if (getLogger().isDebugEnabled())


Reply via email to