Skip to content

Commit

Permalink
ICU-22761 Optimize get value of LocaleObjectCache
Browse files Browse the repository at this point in the history
See #2984
  • Loading branch information
imurluck authored and markusicu committed Sep 23, 2024
1 parent 22ff260 commit 1c33fcf
Showing 1 changed file with 23 additions and 13 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -34,24 +34,34 @@ public V get(K key) {
}
if (value == null) {
key = normalizeKey(key);
V newVal = createObject(key);
if (key == null || newVal == null) {
// subclass must return non-null key/value object
// subclass must return non-null key object
if (key == null) {
return null;
}

CacheEntry<K, V> newEntry = new CacheEntry<K, V>(key, newVal, _queue);
entry = _map.get(key);
if (entry != null) {
value = entry.get();
}
// hit cache
if (value != null) {
return value;
}

while (value == null) {
cleanStaleEntries();
entry = _map.putIfAbsent(key, newEntry);
if (entry == null) {
value = newVal;
break;
} else {
value = entry.get();
}
// 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 (newVal == null) {
// subclass must return non-null value object
return null;
}

CacheEntry<K, V> newEntry = new CacheEntry<K, V>(key, newVal, _queue);
// just replace it
_map.put(key, newEntry);
// clean recycled SoftReferences again
cleanStaleEntries();
return newVal;
}
return value;
}
Expand Down

0 comments on commit 1c33fcf

Please sign in to comment.