diff --git a/hippo4j-core/src/main/java/cn/hippo4j/core/plugin/DefaultThreadPoolPluginRegistrar.java b/hippo4j-core/src/main/java/cn/hippo4j/core/plugin/DefaultThreadPoolPluginRegistrar.java index adf9b1c4..786cb6d8 100644 --- a/hippo4j-core/src/main/java/cn/hippo4j/core/plugin/DefaultThreadPoolPluginRegistrar.java +++ b/hippo4j-core/src/main/java/cn/hippo4j/core/plugin/DefaultThreadPoolPluginRegistrar.java @@ -30,7 +30,7 @@ public class DefaultThreadPoolPluginRegistrar public static final String REGISTRAR_NAME = "DefaultThreadPoolPluginRegistrar"; /** - * aliasRegistry + * alias registry */ private AliasRegistry aliasRegistry; diff --git a/hippo4j-core/src/main/java/cn/hippo4j/core/plugin/DefaultThreadPoolPluginRegistry.java b/hippo4j-core/src/main/java/cn/hippo4j/core/plugin/DefaultThreadPoolPluginRegistry.java index 86c238d0..a11a170a 100644 --- a/hippo4j-core/src/main/java/cn/hippo4j/core/plugin/DefaultThreadPoolPluginRegistry.java +++ b/hippo4j-core/src/main/java/cn/hippo4j/core/plugin/DefaultThreadPoolPluginRegistry.java @@ -21,6 +21,9 @@ import cn.hippo4j.common.toolkit.Assert; import lombok.NonNull; import java.util.*; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReadWriteLock; +import java.util.concurrent.locks.ReentrantReadWriteLock; /** * The default implementation of {@link ThreadPoolPluginRegistry}. @@ -29,6 +32,11 @@ import java.util.*; */ public class DefaultThreadPoolPluginRegistry implements ThreadPoolPluginRegistry { + /** + * lock of this instance + */ + private final ReadWriteLock instanceLock = new ReentrantReadWriteLock(); + /** * Registered {@link ThreadPoolPlugin}. */ @@ -59,11 +67,17 @@ public class DefaultThreadPoolPluginRegistry implements ThreadPoolPluginRegistry */ @Override public synchronized void clear() { - registeredPlugins.clear(); - taskAwarePluginList.clear(); - executeAwarePluginList.clear(); - rejectedAwarePluginList.clear(); - shutdownAwarePluginList.clear(); + Lock writeLock = instanceLock.writeLock(); + writeLock.lock(); + try { + registeredPlugins.clear(); + taskAwarePluginList.clear(); + executeAwarePluginList.clear(); + rejectedAwarePluginList.clear(); + shutdownAwarePluginList.clear(); + } finally { + writeLock.unlock(); + } } /** @@ -74,24 +88,30 @@ public class DefaultThreadPoolPluginRegistry implements ThreadPoolPluginRegistry * @see ThreadPoolPlugin#getId() */ @Override - public synchronized void register(@NonNull ThreadPoolPlugin aware) { - String id = aware.getId(); - Assert.isTrue(!isRegistered(id), "The plug-in with id [" + id + "] has been registered"); - - // register aware - registeredPlugins.put(id, aware); - // quick index - if (aware instanceof TaskAwarePlugin) { - taskAwarePluginList.add((TaskAwarePlugin) aware); - } - if (aware instanceof ExecuteAwarePlugin) { - executeAwarePluginList.add((ExecuteAwarePlugin) aware); - } - if (aware instanceof RejectedAwarePlugin) { - rejectedAwarePluginList.add((RejectedAwarePlugin) aware); - } - if (aware instanceof ShutdownAwarePlugin) { - shutdownAwarePluginList.add((ShutdownAwarePlugin) aware); + public void register(@NonNull ThreadPoolPlugin aware) { + Lock writeLock = instanceLock.writeLock(); + writeLock.lock(); + try { + String id = aware.getId(); + Assert.isTrue(!isRegistered(id), "The plug-in with id [" + id + "] has been registered"); + + // register aware + registeredPlugins.put(id, aware); + // quick index + if (aware instanceof TaskAwarePlugin) { + taskAwarePluginList.add((TaskAwarePlugin) aware); + } + if (aware instanceof ExecuteAwarePlugin) { + executeAwarePluginList.add((ExecuteAwarePlugin) aware); + } + if (aware instanceof RejectedAwarePlugin) { + rejectedAwarePluginList.add((RejectedAwarePlugin) aware); + } + if (aware instanceof ShutdownAwarePlugin) { + shutdownAwarePluginList.add((ShutdownAwarePlugin) aware); + } + } finally { + writeLock.unlock(); } } @@ -101,23 +121,30 @@ public class DefaultThreadPoolPluginRegistry implements ThreadPoolPluginRegistry * @param id name */ @Override - public synchronized void unregister(String id) { - Optional.ofNullable(id) - .map(registeredPlugins::remove) - .ifPresent(old -> { - if (old instanceof TaskAwarePlugin) { - taskAwarePluginList.remove(old); - } - if (old instanceof ExecuteAwarePlugin) { - executeAwarePluginList.remove(old); - } - if (old instanceof RejectedAwarePlugin) { - rejectedAwarePluginList.remove(old); - } - if (old instanceof ShutdownAwarePlugin) { - shutdownAwarePluginList.remove(old); - } - }); + public void unregister(String id) { + Lock writeLock = instanceLock.writeLock(); + writeLock.lock(); + try { + Optional.ofNullable(id) + .map(registeredPlugins::remove) + .ifPresent(old -> { + // remove quick index if necessary + if (old instanceof TaskAwarePlugin) { + taskAwarePluginList.remove(old); + } + if (old instanceof ExecuteAwarePlugin) { + executeAwarePluginList.remove(old); + } + if (old instanceof RejectedAwarePlugin) { + rejectedAwarePluginList.remove(old); + } + if (old instanceof ShutdownAwarePlugin) { + shutdownAwarePluginList.remove(old); + } + }); + } finally { + writeLock.unlock(); + } } /** @@ -128,7 +155,12 @@ public class DefaultThreadPoolPluginRegistry implements ThreadPoolPluginRegistry */ @Override public boolean isRegistered(String id) { - return registeredPlugins.containsKey(id); + Lock readLock = instanceLock.readLock(); + try { + return registeredPlugins.containsKey(id); + } finally { + readLock.unlock(); + } } /** @@ -141,7 +173,12 @@ public class DefaultThreadPoolPluginRegistry implements ThreadPoolPluginRegistry @Override @SuppressWarnings("unchecked") public A getAware(String id) { - return (A) registeredPlugins.get(id); + Lock readLock = instanceLock.readLock(); + try { + return (A) registeredPlugins.get(id); + } finally { + readLock.unlock(); + } } /** @@ -151,7 +188,12 @@ public class DefaultThreadPoolPluginRegistry implements ThreadPoolPluginRegistry */ @Override public Collection getExecuteAwareList() { - return executeAwarePluginList; + Lock readLock = instanceLock.readLock(); + try { + return executeAwarePluginList; + } finally { + readLock.unlock(); + } } /** @@ -161,7 +203,12 @@ public class DefaultThreadPoolPluginRegistry implements ThreadPoolPluginRegistry */ @Override public Collection getRejectedAwareList() { - return rejectedAwarePluginList; + Lock readLock = instanceLock.readLock(); + try { + return rejectedAwarePluginList; + } finally { + readLock.unlock(); + } } /** @@ -171,7 +218,12 @@ public class DefaultThreadPoolPluginRegistry implements ThreadPoolPluginRegistry */ @Override public Collection getShutdownAwareList() { - return shutdownAwarePluginList; + Lock readLock = instanceLock.readLock(); + try { + return shutdownAwarePluginList; + } finally { + readLock.unlock(); + } } /** @@ -181,7 +233,12 @@ public class DefaultThreadPoolPluginRegistry implements ThreadPoolPluginRegistry */ @Override public Collection getTaskAwareList() { - return taskAwarePluginList; + Lock readLock = instanceLock.readLock(); + try { + return taskAwarePluginList; + } finally { + readLock.unlock(); + } } } diff --git a/hippo4j-core/src/main/java/cn/hippo4j/core/plugin/ThreadPoolPluginRegistrar.java b/hippo4j-core/src/main/java/cn/hippo4j/core/plugin/ThreadPoolPluginRegistrar.java index a45f28c4..91e32c02 100644 --- a/hippo4j-core/src/main/java/cn/hippo4j/core/plugin/ThreadPoolPluginRegistrar.java +++ b/hippo4j-core/src/main/java/cn/hippo4j/core/plugin/ThreadPoolPluginRegistrar.java @@ -11,6 +11,7 @@ public interface ThreadPoolPluginRegistrar { /** * Get id. + * In spring container, the obtained id will be used as the alias of the bean name. * * @return id */ diff --git a/hippo4j-core/src/main/java/cn/hippo4j/core/plugin/ThreadPoolPluginRegistry.java b/hippo4j-core/src/main/java/cn/hippo4j/core/plugin/ThreadPoolPluginRegistry.java index dd89353d..597bb1ae 100644 --- a/hippo4j-core/src/main/java/cn/hippo4j/core/plugin/ThreadPoolPluginRegistry.java +++ b/hippo4j-core/src/main/java/cn/hippo4j/core/plugin/ThreadPoolPluginRegistry.java @@ -38,6 +38,9 @@ public interface ThreadPoolPluginRegistry { * Register a {@link ThreadPoolPlugin} * * @param aware aware + * @throws IllegalArgumentException thrown when a plugin with the same {@link ThreadPoolPlugin#getId()} + * already exists in the registry + * @see ThreadPoolPlugin#getId() */ void register(ThreadPoolPlugin aware);