chore: Use ReentrantLock for loading Extension Classes (#14056)

This commit is contained in:
He-Pin(kerr) 2024-04-13 13:05:16 +08:00 committed by GitHub
parent 314547ef4d
commit 7cf5fe42f2
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 6 additions and 1 deletions

View File

@ -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;