Index: working_vm/vm/vmcore/src/kernel_classes/javasrc/org/apache/harmony/kernel/vm/VM.java =================================================================== --- working_vm/vm/vmcore/src/kernel_classes/javasrc/org/apache/harmony/kernel/vm/VM.java (revision 631623) +++ working_vm/vm/vmcore/src/kernel_classes/javasrc/org/apache/harmony/kernel/vm/VM.java (working copy) @@ -105,7 +105,7 @@ * @return String that has the same contents as * argument, but from internal pool */ - public static synchronized String intern(String s) + public static String intern(String s) { return internedStrings.intern(s); } Index: working_vm/vm/vmcore/src/kernel_classes/javasrc/org/apache/harmony/kernel/vm/InternMap.java =================================================================== --- working_vm/vm/vmcore/src/kernel_classes/javasrc/org/apache/harmony/kernel/vm/InternMap.java (revision 631623) +++ working_vm/vm/vmcore/src/kernel_classes/javasrc/org/apache/harmony/kernel/vm/InternMap.java (working copy) @@ -101,6 +101,35 @@ { int index = 0; Entry entry; + String interned = null; + + if ((interned = tryIntern(key)) == null) { + + synchronized(this) { + + if ((interned = tryIntern(key)) == null) { + + // no interned string found, put a new entry for it + if (++elementCount > threshold) { + rehash(); + index = (key.hashCode() & 0x7FFFFFFF) % elementData.length; + } + entry = new Entry(key, referenceQueue); + entry.next = elementData[index]; + elementData[index] = entry; + return key; + } else { + return interned; + } + } + } else { + return interned; + } + } + + private String tryIntern(String key) { + int index = 0; + Entry entry; String interned = null; if (key == null) return null; @@ -115,19 +144,13 @@ // if we found the entry, return it if (entry != null) { return interned; - } + } else { + return null; + } - // no interned string found, put a new entry for it - if (++elementCount > threshold) { - rehash(); - index = (key.hashCode() & 0x7FFFFFFF) % elementData.length; - } - entry = new Entry(key, referenceQueue); - entry.next = elementData[index]; - elementData[index] = entry; - return key; } + private void rehash() { poll();