From cbac8013a17ce6e43a6cedeb4533a0ff86b20cbd Mon Sep 17 00:00:00 2001 From: Christian Schuster Date: Tue, 10 Feb 2026 16:15:49 +0100 Subject: [PATCH] avoid unnecessary locking in ConcurrentReferenceHashMap's implementation of computeIfAbsent and computeIfPresent Signed-off-by: Christian Schuster --- .../util/ConcurrentReferenceHashMap.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) 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) {