From 7cf5fe42f2c92a33cf5d0f973fcb021f21fe7f05 Mon Sep 17 00:00:00 2001 From: "He-Pin(kerr)" Date: Sat, 13 Apr 2024 13:05:16 +0800 Subject: [PATCH] chore: Use ReentrantLock for loading Extension Classes (#14056) --- .../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 { private final ConcurrentMap, String> cachedNames = new ConcurrentHashMap<>(); + private final ReentrantLock loadExtensionClassesLock = new ReentrantLock(); private final Holder>> cachedClasses = new Holder<>(); private final Map cachedActivates = Collections.synchronizedMap(new LinkedHashMap<>()); @@ -951,7 +953,8 @@ public class ExtensionLoader { private Map> getExtensionClasses() { Map> 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 { } cachedClasses.set(classes); } + } finally { + loadExtensionClassesLock.unlock(); } } return classes;