You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2012/02/15 20:07:55 UTC

svn commit: r1244648 - in /camel/branches/camel-2.9.x: ./ camel-core/src/main/java/org/apache/camel/impl/converter/ camel-core/src/test/java/org/apache/camel/issues/

Author: davsclaus
Date: Wed Feb 15 19:07:55 2012
New Revision: 1244648

URL: http://svn.apache.org/viewvc?rev=1244648&view=rev
Log:
CAMEL-5002: Improved type converter lookup to avoid synchronization.

Added:
    camel/branches/camel-2.9.x/camel-core/src/test/java/org/apache/camel/issues/MyCamelBean.java
      - copied unchanged from r1244644, camel/trunk/camel-core/src/test/java/org/apache/camel/issues/MyCamelBean.java
    camel/branches/camel-2.9.x/camel-core/src/test/java/org/apache/camel/issues/TypeConverterConcurrencyIssueTest.java
      - copied unchanged from r1244644, camel/trunk/camel-core/src/test/java/org/apache/camel/issues/TypeConverterConcurrencyIssueTest.java
Modified:
    camel/branches/camel-2.9.x/   (props changed)
    camel/branches/camel-2.9.x/camel-core/src/main/java/org/apache/camel/impl/converter/BaseTypeConverterRegistry.java

Propchange: camel/branches/camel-2.9.x/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Wed Feb 15 19:07:55 2012
@@ -1 +1 @@
-/camel/trunk:1243046,1243057,1243234,1244518
+/camel/trunk:1243046,1243057,1243234,1244518,1244644

Propchange: camel/branches/camel-2.9.x/
------------------------------------------------------------------------------
Binary property 'svnmerge-integrated' - no diff available.

Modified: camel/branches/camel-2.9.x/camel-core/src/main/java/org/apache/camel/impl/converter/BaseTypeConverterRegistry.java
URL: http://svn.apache.org/viewvc/camel/branches/camel-2.9.x/camel-core/src/main/java/org/apache/camel/impl/converter/BaseTypeConverterRegistry.java?rev=1244648&r1=1244647&r2=1244648&view=diff
==============================================================================
--- camel/branches/camel-2.9.x/camel-core/src/main/java/org/apache/camel/impl/converter/BaseTypeConverterRegistry.java (original)
+++ camel/branches/camel-2.9.x/camel-core/src/main/java/org/apache/camel/impl/converter/BaseTypeConverterRegistry.java Wed Feb 15 19:07:55 2012
@@ -52,7 +52,7 @@ import org.slf4j.LoggerFactory;
  */
 public abstract class BaseTypeConverterRegistry extends ServiceSupport implements TypeConverter, TypeConverterRegistry {
     protected final transient Logger log = LoggerFactory.getLogger(getClass());
-    protected final Map<TypeMapping, TypeConverter> typeMappings = new ConcurrentHashMap<TypeMapping, TypeConverter>();
+    protected final ConcurrentHashMap<TypeMapping, TypeConverter> typeMappings = new ConcurrentHashMap<TypeMapping, TypeConverter>();
     protected final Map<TypeMapping, TypeMapping> misses = new ConcurrentHashMap<TypeMapping, TypeMapping>();
     protected final List<TypeConverterLoader> typeConverterLoaders = new ArrayList<TypeConverterLoader>();
     protected final List<FallbackTypeConverter> fallbackConverters = new ArrayList<FallbackTypeConverter>();
@@ -237,18 +237,16 @@ public abstract class BaseTypeConverterR
     public void addTypeConverter(Class<?> toType, Class<?> fromType, TypeConverter typeConverter) {
         log.trace("Adding type converter: {}", typeConverter);
         TypeMapping key = new TypeMapping(toType, fromType);
-        synchronized (typeMappings) {
-            TypeConverter converter = typeMappings.get(key);
-            // only override it if its different
-            // as race conditions can lead to many threads trying to promote the same fallback converter
-            if (typeConverter != converter) {
-                if (converter != null) {
-                    log.warn("Overriding type converter from: " + converter + " to: " + typeConverter);
-                }
-                typeMappings.put(key, typeConverter);
-                // remove any previous misses, as we added the new type converter
-                misses.remove(key);
+        TypeConverter converter = typeMappings.get(key);
+        // only override it if its different
+        // as race conditions can lead to many threads trying to promote the same fallback converter
+        if (typeConverter != converter) {
+            if (converter != null) {
+                log.warn("Overriding type converter from: " + converter + " to: " + typeConverter);
             }
+            typeMappings.put(key, typeConverter);
+            // remove any previous misses, as we added the new type converter
+            misses.remove(key);
         }
     }
 
@@ -281,22 +279,18 @@ public abstract class BaseTypeConverterR
 
     public Set<Class<?>> getFromClassMappings() {
         Set<Class<?>> answer = new HashSet<Class<?>>();
-        synchronized (typeMappings) {
-            for (TypeMapping mapping : typeMappings.keySet()) {
-                answer.add(mapping.getFromType());
-            }
+        for (TypeMapping mapping : typeMappings.keySet()) {
+            answer.add(mapping.getFromType());
         }
         return answer;
     }
 
     public Map<Class<?>, TypeConverter> getToClassMappings(Class<?> fromClass) {
         Map<Class<?>, TypeConverter> answer = new HashMap<Class<?>, TypeConverter>();
-        synchronized (typeMappings) {
-            for (Map.Entry<TypeMapping, TypeConverter> entry : typeMappings.entrySet()) {
-                TypeMapping mapping = entry.getKey();
-                if (mapping.isApplicable(fromClass)) {
-                    answer.put(mapping.getToType(), entry.getValue());
-                }
+        for (Map.Entry<TypeMapping, TypeConverter> entry : typeMappings.entrySet()) {
+            TypeMapping mapping = entry.getKey();
+            if (mapping.isApplicable(fromClass)) {
+                answer.put(mapping.getToType(), entry.getValue());
             }
         }
         return answer;
@@ -312,14 +306,12 @@ public abstract class BaseTypeConverterR
             fromType = value.getClass();
         }
         TypeMapping key = new TypeMapping(toType, fromType);
-        TypeConverter converter;
-        synchronized (typeMappings) {
-            converter = typeMappings.get(key);
-            if (converter == null) {
-                converter = lookup(toType, fromType);
-                if (converter != null) {
-                    typeMappings.put(key, converter);
-                }
+        TypeConverter converter = typeMappings.get(key);
+        if (converter == null) {
+            // converter not found, try to lookup then
+            converter = lookup(toType, fromType);
+            if (converter != null) {
+                typeMappings.putIfAbsent(key, converter);
             }
         }
         return converter;