This is an automated email from the ASF dual-hosted git repository.
albumenj pushed a commit to branch 3.3
in repository https://gitbox.apache.org/repos/asf/dubbo.git
The following commit(s) were added to refs/heads/3.3 by this push:
new 7cf5fe42f2 chore: Use ReentrantLock for loading Extension Classes
(#14056)
7cf5fe42f2 is described below
commit 7cf5fe42f2c92a33cf5d0f973fcb021f21fe7f05
Author: He-Pin(kerr) <[email protected]>
AuthorDate: Sat Apr 13 13:05:16 2024 +0800
chore: Use ReentrantLock for loading Extension Classes (#14056)
---
.../java/org/apache/dubbo/common/extension/ExtensionLoader.java | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git
a/dubbo-common/src/main/java/org/apache/dubbo/common/extension/ExtensionLoader.java
b/dubbo-common/src/main/java/org/apache/dubbo/common/extension/ExtensionLoader.java
index 35c190b5f8..a9a529a8ca 100644
---
a/dubbo-common/src/main/java/org/apache/dubbo/common/extension/ExtensionLoader.java
+++
b/dubbo-common/src/main/java/org/apache/dubbo/common/extension/ExtensionLoader.java
@@ -75,6 +75,7 @@ import java.util.TreeSet;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.locks.ReentrantLock;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
@@ -120,6 +121,7 @@ public class ExtensionLoader<T> {
private final ConcurrentMap<Class<?>, String> cachedNames = new
ConcurrentHashMap<>();
+ private final ReentrantLock loadExtensionClassesLock = new ReentrantLock();
private final Holder<Map<String, Class<?>>> cachedClasses = new Holder<>();
private final Map<String, Object> cachedActivates =
Collections.synchronizedMap(new LinkedHashMap<>());
@@ -951,7 +953,8 @@ public class ExtensionLoader<T> {
private Map<String, Class<?>> getExtensionClasses() {
Map<String, Class<?>> classes = cachedClasses.get();
if (classes == null) {
- synchronized (cachedClasses) {
+ loadExtensionClassesLock.lock();
+ try {
classes = cachedClasses.get();
if (classes == null) {
try {
@@ -968,6 +971,8 @@ public class ExtensionLoader<T> {
}
cachedClasses.set(classes);
}
+ } finally {
+ loadExtensionClassesLock.unlock();
}
}
return classes;