IJPL-568 ConcurrentRefValueHashMap.putIfAbsent does not get rid of obsolete references when the insertion succeeds from the first try

GitOrigin-RevId: 377c170b64fc92f732d33ce811601b6d20ea1a73
This commit is contained in:
Alexey Kudravtsev
2024-01-31 13:26:48 +01:00
committed by intellij-monorepo-bot
parent 9a6807daab
commit 0fe1ce6791
2 changed files with 21 additions and 1 deletions

View File

@@ -61,9 +61,9 @@ abstract class ConcurrentRefValueHashMap<K, V> implements ConcurrentMap<K, V> {
public V putIfAbsent(@NotNull K key, @NotNull V value) {
ValueReference<K, V> newRef = createValueReference(key, value);
while (true) {
processQueue();
ValueReference<K, V> oldRef = myMap.putIfAbsent(key, newRef);
if (oldRef == null) return null;
processQueue();
V oldVal = oldRef.get();
if (oldVal == null) {
if (myMap.replace(key, oldRef, newRef)) return null;