diff --git a/icu4j/main/core/src/main/java/com/ibm/icu/impl/locale/LocaleObjectCache.java b/icu4j/main/core/src/main/java/com/ibm/icu/impl/locale/LocaleObjectCache.java index 32049766c2f..c549d7a6209 100644 --- a/icu4j/main/core/src/main/java/com/ibm/icu/impl/locale/LocaleObjectCache.java +++ b/icu4j/main/core/src/main/java/com/ibm/icu/impl/locale/LocaleObjectCache.java @@ -34,24 +34,34 @@ public abstract class LocaleObjectCache { } if (value == null) { key = normalizeKey(key); + // subclass must return non-null key object + if (key == null) { + return null; + } + + entry = _map.get(key); + if (entry != null) { + value = entry.get(); + } + // hit cache + if (value != null) { + return value; + } + + // if map not contains key or the referent value of CacheEntry is set to be null + // both need create a new value V newVal = createObject(key); - if (key == null || newVal == null) { - // subclass must return non-null key/value object + if (newVal == null) { + // subclass must return non-null value object return null; } CacheEntry newEntry = new CacheEntry(key, newVal, _queue); - - while (value == null) { - cleanStaleEntries(); - entry = _map.putIfAbsent(key, newEntry); - if (entry == null) { - value = newVal; - break; - } else { - value = entry.get(); - } - } + // just replace it + _map.put(key, newEntry); + // clean recycled SoftReferences again + cleanStaleEntries(); + return newVal; } return value; }