You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by ti...@apache.org on 2016/07/07 18:29:20 UTC

svn commit: r1751824 - /pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/encoding/Encoding.java

Author: tilman
Date: Thu Jul  7 18:29:20 2016
New Revision: 1751824

URL: http://svn.apache.org/viewvc?rev=1751824&view=rev
Log:
PDFBOX-3404: drop concurrent HashSet, synchronize initialization instead

Modified:
    pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/encoding/Encoding.java

Modified: pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/encoding/Encoding.java
URL: http://svn.apache.org/viewvc/pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/encoding/Encoding.java?rev=1751824&r1=1751823&r2=1751824&view=diff
==============================================================================
--- pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/encoding/Encoding.java (original)
+++ pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/encoding/Encoding.java Thu Jul  7 18:29:20 2016
@@ -18,9 +18,9 @@ package org.apache.pdfbox.pdmodel.font.e
 
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Map;
 import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
 import org.apache.pdfbox.cos.COSName;
 import org.apache.pdfbox.pdmodel.common.COSObjectable;
 
@@ -109,8 +109,15 @@ public abstract class Encoding implement
         // otherwise /Differences won't be accounted for
         if (names == null)
         {
-            names = Collections.newSetFromMap(new ConcurrentHashMap<String, Boolean>());
-            names.addAll(codeToName.values());
+            synchronized(this)
+            {
+                // PDFBOX-3404: avoid possibility that one thread ends up with newly created empty map from other thread
+                Set<String> tmpSet = new HashSet<String>(codeToName.values());
+                // make sure that assignment is done after initialisation is complete
+                names = tmpSet;
+                // note that it might still happen that 'names' is initialized twice, but this is harmless
+            }
+            // at this point, names will never be null.
         }
         return names.contains(name);
     }