diff --git a/spring-core/src/main/java/org/springframework/util/ConcurrentReferenceHashMap.java b/spring-core/src/main/java/org/springframework/util/ConcurrentReferenceHashMap.java index 46986ac233f0..e1afe56aff6a 100644 --- a/spring-core/src/main/java/org/springframework/util/ConcurrentReferenceHashMap.java +++ b/spring-core/src/main/java/org/springframework/util/ConcurrentReferenceHashMap.java @@ -371,6 +371,12 @@ protected Boolean execute(@Nullable Reference ref, @Nullable Entry e @Override public @Nullable V computeIfAbsent(@Nullable K key, Function<@Nullable ? super K, @Nullable ? extends V> mappingFunction) { + // avoid locking if entry is present + Reference ref = getReference(key, Restructure.NEVER); + Entry entry = (ref != null ? ref.get() : null); + if (entry != null) { + return entry.getValue(); + } return doTask(key, new Task(TaskOption.RESTRUCTURE_BEFORE, TaskOption.RESIZE) { @Override protected @Nullable V execute(@Nullable Reference ref, @Nullable Entry entry, @Nullable Entries entries) { @@ -390,6 +396,12 @@ protected Boolean execute(@Nullable Reference ref, @Nullable Entry e @Override public @Nullable V computeIfPresent(@Nullable K key, BiFunction<@Nullable ? super K, @Nullable ? super V, @Nullable ? extends V> remappingFunction) { + // avoid locking if entry is absent + Reference ref = getReference(key, Restructure.NEVER); + Entry entry = (ref != null ? ref.get() : null); + if (entry == null) { + return null; + } return doTask(key, new Task(TaskOption.RESTRUCTURE_BEFORE, TaskOption.RESIZE) { @Override protected @Nullable V execute(@Nullable Reference ref, @Nullable Entry entry, @Nullable Entries entries) {