From 3b6be3d4d3fa375735cc27b2a95e87a00a0531bf Mon Sep 17 00:00:00 2001 From: Patrick Strawderman Date: Fri, 14 Nov 2025 12:55:11 -0800 Subject: [PATCH] Fix single-check idiom in UnmodifiableMultiValueMap Read the respective fields only once in the values(), entrySet(), and keySet() methods. Closes gh-35822 Signed-off-by: Patrick Strawderman --- .../util/UnmodifiableMultiValueMap.java | 24 ++++++++++++------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/spring-core/src/main/java/org/springframework/util/UnmodifiableMultiValueMap.java b/spring-core/src/main/java/org/springframework/util/UnmodifiableMultiValueMap.java index 8db025670c2..5ab48e4f045 100644 --- a/spring-core/src/main/java/org/springframework/util/UnmodifiableMultiValueMap.java +++ b/spring-core/src/main/java/org/springframework/util/UnmodifiableMultiValueMap.java @@ -141,26 +141,32 @@ final class UnmodifiableMultiValueMap implements MultiValueMap, Serial @Override public Set keySet() { - if (this.keySet == null) { - this.keySet = Collections.unmodifiableSet(this.delegate.keySet()); + Set keySet = this.keySet; + if (keySet == null) { + keySet = Collections.unmodifiableSet(this.delegate.keySet()); + this.keySet = keySet; } - return this.keySet; + return keySet; } @Override public Set>> entrySet() { - if (this.entrySet == null) { - this.entrySet = new UnmodifiableEntrySet<>(this.delegate.entrySet()); + Set>> entrySet = this.entrySet; + if (entrySet == null) { + entrySet = new UnmodifiableEntrySet<>(this.delegate.entrySet()); + this.entrySet = entrySet; } - return this.entrySet; + return entrySet; } @Override public Collection> values() { - if (this.values == null) { - this.values = new UnmodifiableValueCollection<>(this.delegate.values()); + Collection> values = this.values; + if (values == null) { + values = new UnmodifiableValueCollection<>(this.delegate.values()); + this.values = values; } - return this.values; + return values; } // unsupported