Author: jahewson Date: Fri Jul 17 00:21:35 2015 New Revision: 1691465 URL: http://svn.apache.org/r1691465 Log: PDFBOX-2862: Avoid concurrent access of nameToUnicode map
Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/encoding/GlyphList.java Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/encoding/GlyphList.java URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/encoding/GlyphList.java?rev=1691465&r1=1691464&r2=1691465&view=diff ============================================================================== --- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/encoding/GlyphList.java (original) +++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/encoding/GlyphList.java Fri Jul 17 00:21:35 2015 @@ -91,8 +91,12 @@ public final class GlyphList return ZAPF_DINGBATS; } + // read-only mappings, never modified outside GlyphList's constructor private final Map<String, String> nameToUnicode; private final Map<String, String> unicodeToName; + + // additional read/write cache for uniXXXX names + private final Map<String, String> uniNameToUnicodeCache = new HashMap<String, String>(); /** * Creates a new GlyphList from a glyph list file. @@ -217,6 +221,13 @@ public final class GlyphList } String unicode = nameToUnicode.get(name); + if (unicode != null) + { + return unicode; + } + + // separate read/write cache for thread safety + unicode = uniNameToUnicodeCache.get(name); if (unicode == null) { // test if we have a suffix and if so remove it @@ -270,7 +281,7 @@ public final class GlyphList LOG.warn("Not a number in Unicode character name: " + name); } } - nameToUnicode.put(name, unicode); + uniNameToUnicodeCache.put(name, unicode); } return unicode; }