Skip to content

Commit 16ab7e0

Browse files
committed
avoid unnecessary locking in ConcurrentReferenceHashMap's implementation of computeIfAbsent and computeIfPresent
1 parent c33b82f commit 16ab7e0

1 file changed

Lines changed: 12 additions & 0 deletions

File tree

spring-core/src/main/java/org/springframework/util/ConcurrentReferenceHashMap.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -371,6 +371,12 @@ protected Boolean execute(@Nullable Reference<K, V> ref, @Nullable Entry<K, V> e
371371

372372
@Override
373373
public @Nullable V computeIfAbsent(@Nullable K key, Function<@Nullable ? super K, @Nullable ? extends V> mappingFunction) {
374+
// avoid locking if entry is present
375+
Reference<K, V> ref = getReference(key, Restructure.NEVER);
376+
Entry<K, V> entry = (ref != null ? ref.get() : null);
377+
if (entry != null) {
378+
return entry.getValue();
379+
}
374380
return doTask(key, new Task<V>(TaskOption.RESTRUCTURE_BEFORE, TaskOption.RESIZE) {
375381
@Override
376382
protected @Nullable V execute(@Nullable Reference<K, V> ref, @Nullable Entry<K, V> entry, @Nullable Entries<V> entries) {
@@ -390,6 +396,12 @@ protected Boolean execute(@Nullable Reference<K, V> ref, @Nullable Entry<K, V> e
390396

391397
@Override
392398
public @Nullable V computeIfPresent(@Nullable K key, BiFunction<@Nullable ? super K, @Nullable ? super V, @Nullable ? extends V> remappingFunction) {
399+
// avoid locking if entry is absent
400+
Reference<K, V> ref = getReference(key, Restructure.NEVER);
401+
Entry<K, V> entry = (ref != null ? ref.get() : null);
402+
if (entry == null) {
403+
return null;
404+
}
393405
return doTask(key, new Task<V>(TaskOption.RESTRUCTURE_BEFORE, TaskOption.RESIZE) {
394406
@Override
395407
protected @Nullable V execute(@Nullable Reference<K, V> ref, @Nullable Entry<K, V> entry, @Nullable Entries<V> entries) {

0 commit comments

Comments
 (0)