You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@uima.apache.org by sc...@apache.org on 2014/02/19 21:13:04 UTC

svn commit: r1569899 - /uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/analysis_engine/impl/RsLang.java

Author: schor
Date: Wed Feb 19 20:13:04 2014
New Revision: 1569899

URL: http://svn.apache.org/r1569899
Log:
[UIMA-3638] Remove sync, switch to ConcurrentHashMap

Modified:
    uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/analysis_engine/impl/RsLang.java

Modified: uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/analysis_engine/impl/RsLang.java
URL: http://svn.apache.org/viewvc/uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/analysis_engine/impl/RsLang.java?rev=1569899&r1=1569898&r2=1569899&view=diff
==============================================================================
--- uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/analysis_engine/impl/RsLang.java (original)
+++ uima/uimaj/trunk/uimaj-core/src/main/java/org/apache/uima/analysis_engine/impl/RsLang.java Wed Feb 19 20:13:04 2014
@@ -18,8 +18,8 @@
  */
 package org.apache.uima.analysis_engine.impl;
 
-import java.util.HashMap;
-import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
 
 import org.apache.uima.cas.text.Language;
 
@@ -31,7 +31,7 @@ public class RsLang {
  /**
    * global set for canonical language strings
    */
-  private static final Map<String, String> canonicalLanguageStrings = new HashMap<String, String>();
+  private static final ConcurrentMap<String, String> canonicalLanguageStrings = new ConcurrentHashMap<String, String>();
  
   /**
    * 
@@ -43,15 +43,15 @@ public class RsLang {
     if (language == null || language.equals(Language.UNSPECIFIED_LANGUAGE)) {  // represents x-unspecified
       return Language.UNSPECIFIED_LANGUAGE;
     }
-    synchronized(canonicalLanguageStrings) {
-      String cl = canonicalLanguageStrings.get(language);
-      if (cl == null) {
-        // make new string based on trimmed chars if needed, in case holding on to big string
-        language = new String(language);
-        canonicalLanguageStrings.put(language, language);
-        return language;
-      }
-      return cl;
+    String cl = canonicalLanguageStrings.get(language), clOther;
+    if (cl == null) {
+      // make new string based on trimmed chars if needed, in case holding on to big string
+      // This strange construct is intended to drop references to big char arrays  
+      //   where only a part the big char arrays constitute this string.
+      language = new StringBuilder(language.length()).append(language).toString();
+      clOther = canonicalLanguageStrings.putIfAbsent(language, language);
+      cl = (clOther != null) ? clOther : language;
     }
+    return cl;
   }
 }