Skip to content

Commit 3d2de9a

Browse files
committed
Efficient concurrency in MethodOverrides through CopyOnWriteArraySet
Closes gh-23448
1 parent cc1f0e1 commit 3d2de9a

File tree

1 file changed

+9
-21
lines changed

1 file changed

+9
-21
lines changed

spring-beans/src/main/java/org/springframework/beans/factory/support/MethodOverrides.java

Lines changed: 9 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,8 @@
1717
package org.springframework.beans.factory.support;
1818

1919
import java.lang.reflect.Method;
20-
import java.util.Collections;
21-
import java.util.LinkedHashSet;
2220
import java.util.Set;
21+
import java.util.concurrent.CopyOnWriteArraySet;
2322

2423
/**
2524
* Set of method overrides, determining which, if any, methods on a
@@ -35,10 +34,7 @@
3534
*/
3635
public class MethodOverrides {
3736

38-
private final Set<MethodOverride> overrides =
39-
Collections.synchronizedSet(new LinkedHashSet<MethodOverride>(0));
40-
41-
private volatile boolean modified = false;
37+
private final Set<MethodOverride> overrides = new CopyOnWriteArraySet<MethodOverride>();
4238

4339

4440
/**
@@ -60,7 +56,6 @@ public MethodOverrides(MethodOverrides other) {
6056
*/
6157
public void addOverrides(MethodOverrides other) {
6258
if (other != null) {
63-
this.modified = true;
6459
this.overrides.addAll(other.overrides);
6560
}
6661
}
@@ -69,25 +64,23 @@ public void addOverrides(MethodOverrides other) {
6964
* Add the given method override.
7065
*/
7166
public void addOverride(MethodOverride override) {
72-
this.modified = true;
7367
this.overrides.add(override);
7468
}
7569

7670
/**
7771
* Return all method overrides contained by this object.
78-
* @return Set of MethodOverride objects
72+
* @return a Set of MethodOverride objects
7973
* @see MethodOverride
8074
*/
8175
public Set<MethodOverride> getOverrides() {
82-
this.modified = true;
8376
return this.overrides;
8477
}
8578

8679
/**
8780
* Return whether the set of method overrides is empty.
8881
*/
8982
public boolean isEmpty() {
90-
return (!this.modified || this.overrides.isEmpty());
83+
return this.overrides.isEmpty();
9184
}
9285

9386
/**
@@ -96,18 +89,13 @@ public boolean isEmpty() {
9689
* @return the method override, or {@code null} if none
9790
*/
9891
public MethodOverride getOverride(Method method) {
99-
if (!this.modified) {
100-
return null;
101-
}
102-
synchronized (this.overrides) {
103-
MethodOverride match = null;
104-
for (MethodOverride candidate : this.overrides) {
105-
if (candidate.matches(method)) {
106-
match = candidate;
107-
}
92+
MethodOverride match = null;
93+
for (MethodOverride candidate : this.overrides) {
94+
if (candidate.matches(method)) {
95+
match = candidate;
10896
}
109-
return match;
11097
}
98+
return match;
11199
}
112100

113101

0 commit comments

Comments
 (0)