You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ofbiz.apache.org by do...@apache.org on 2010/02/14 23:34:47 UTC

svn commit: r910096 - /ofbiz/trunk/framework/base/src/org/ofbiz/base/conversion/Converters.java

Author: doogie
Date: Sun Feb 14 22:34:46 2010
New Revision: 910096

URL: http://svn.apache.org/viewvc?rev=910096&view=rev
Log:
Implement unsynchronized(non-blocking) access to converterMap and
noConversion.

Modified:
    ofbiz/trunk/framework/base/src/org/ofbiz/base/conversion/Converters.java

Modified: ofbiz/trunk/framework/base/src/org/ofbiz/base/conversion/Converters.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/base/src/org/ofbiz/base/conversion/Converters.java?rev=910096&r1=910095&r2=910096&view=diff
==============================================================================
--- ofbiz/trunk/framework/base/src/org/ofbiz/base/conversion/Converters.java (original)
+++ ofbiz/trunk/framework/base/src/org/ofbiz/base/conversion/Converters.java Sun Feb 14 22:34:46 2010
@@ -37,8 +37,8 @@
 public class Converters {
     protected static final String module = Converters.class.getName();
     protected static final String DELIMITER = "->";
-    protected static final Map<String, Converter<?, ?>> converterMap = FastMap.newInstance();
-    protected static final Set<String> noConversions = FastSet.newInstance();
+    protected static final FastMap<String, Converter<?, ?>> converterMap = FastMap.newInstance();
+    protected static final FastSet<String> noConversions = FastSet.newInstance();
     /** Null converter used when the source and target java object
      * types are the same. The <code>convert</code> method returns the
      * source object.
@@ -47,6 +47,7 @@
     public static final Converter<Object, Object> nullConverter = new NullConverter();
 
     static {
+        converterMap.setShared(true);
         ClassLoader loader = Thread.currentThread().getContextClassLoader();
         Iterator<ConverterLoader> converterLoaders = ServiceRegistry.lookupProviders(ConverterLoader.class, loader);
         while (converterLoaders.hasNext()) {
@@ -81,36 +82,40 @@
         if (Debug.verboseOn()) {
             Debug.logVerbose("Getting converter: " + key, module);
         }
-        Converter<?, ?> result = converterMap.get(key);
-        if (result == null) {
-            if (!noConversions.contains(key)) {
-                synchronized (converterMap) {
-                    for (Converter<?, ?> value : converterMap.values()) {
-                        if (value.canConvert(sourceClass, targetClass)) {
-                            converterMap.put(key, value);
-                            return UtilGenerics.cast(value);
-                        }
-                    }
-                    result = checkExtendsImplements(sourceClass, targetClass);
-                    if (result != null) {
-                        return UtilGenerics.cast(result);
-                    }
-                    // Null converter must be checked last
-                    if (nullConverter.canConvert(sourceClass, targetClass)) {
-                        Converter passThruConverter = new PassThruConverter<S>(sourceClass);
-                        converterMap.put(key, passThruConverter);
-                        return UtilGenerics.cast(passThruConverter);
-                    }
-                    noConversions.add(key);
-                    Debug.logWarning("*** No converter found, converting from " +
-                            sourceClass.getName() + " to " + targetClass.getName() +
-                            ". Please report this message to the developer community so " +
-                            "a suitable converter can be created. ***", module);
+OUTER:
+        do {
+            Converter<?, ?> result = converterMap.get(key);
+            if (result != null) {
+                return UtilGenerics.cast(result);
+            }
+            if (noConversions.contains(key)) {
+                throw new ClassNotFoundException("No converter found for " + key);
+            }
+            for (Converter<?, ?> value : converterMap.values()) {
+                if (value.canConvert(sourceClass, targetClass)) {
+                    converterMap.putIfAbsent(key, value);
+                    continue OUTER;
                 }
             }
+            result = checkExtendsImplements(sourceClass, targetClass);
+            if (result != null) {
+                converterMap.putIfAbsent(key, result);
+                continue;
+            }
+            // Null converter must be checked last
+            if (nullConverter.canConvert(sourceClass, targetClass)) {
+                Converter passThruConverter = new PassThruConverter<S>(sourceClass);
+                converterMap.putIfAbsent(key, passThruConverter);
+                continue;
+            }
+            if (noConversions.add(key)) {
+                Debug.logWarning("*** No converter found, converting from " +
+                        sourceClass.getName() + " to " + targetClass.getName() +
+                        ". Please report this message to the developer community so " +
+                        "a suitable converter can be created. ***", module);
+            }
             throw new ClassNotFoundException("No converter found for " + key);
-        }
-        return UtilGenerics.cast(result);
+        } while (true);
     }
 
     private static <S, T> Converter<S, T> checkExtendsImplements(Class<S> sourceClass, Class<T> targetClass) throws ClassNotFoundException {
@@ -187,10 +192,7 @@
             sb.append("<null>");
         }
         String key = sb.toString();
-        if (converterMap.get(key) == null) {
-            synchronized (converterMap) {
-                converterMap.put(key, converter);
-            }
+        if (converterMap.putIfAbsent(key, converter) == null) {
             if (Debug.verboseOn()) {
                 Debug.logVerbose("Registered converter " + converter.getClass().getName(), module);
             }



Re: svn commit: r910096 - /ofbiz/trunk/framework/base/src/org/ofbiz/base/conversion/Converters.java

Posted by Adam Heath <do...@brainfood.com>.
Adrian Crum wrote:
> doogie@apache.org wrote:
>> Author: doogie
>> Date: Sun Feb 14 22:34:46 2010
>> New Revision: 910096
>>
>> URL: http://svn.apache.org/viewvc?rev=910096&view=rev
>> Log:
>> Implement unsynchronized(non-blocking) access to converterMap and
>> noConversion.
>>
>> Modified:
>>    
>> ofbiz/trunk/framework/base/src/org/ofbiz/base/conversion/Converters.java
> 
> Adam,
> 
> Do you know of any advantages/disadvantages of using FastMap versus
> ConcurrentHashMap?

FastMap is more stable with regard to memory allocation.  It might be
a tad slower because of this, but it's execution profile doesn't vary
as much.

Re: svn commit: r910096 - /ofbiz/trunk/framework/base/src/org/ofbiz/base/conversion/Converters.java

Posted by Adrian Crum <ad...@hlmksw.com>.
doogie@apache.org wrote:
> Author: doogie
> Date: Sun Feb 14 22:34:46 2010
> New Revision: 910096
> 
> URL: http://svn.apache.org/viewvc?rev=910096&view=rev
> Log:
> Implement unsynchronized(non-blocking) access to converterMap and
> noConversion.
> 
> Modified:
>     ofbiz/trunk/framework/base/src/org/ofbiz/base/conversion/Converters.java

Adam,

Do you know of any advantages/disadvantages of using FastMap versus 
ConcurrentHashMap?