From 7e8a6679cc91814375ceb5712ee3e5fd22dbeb23 Mon Sep 17 00:00:00 2001 From: Glavo Date: Mon, 29 Sep 2025 15:49:18 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B0=86=20EventManager=20=E4=B8=AD=E7=9A=84?= =?UTF-8?q?=20synchronized=20=E6=9B=BF=E6=8D=A2=E4=B8=BA=20ReentrantLock?= =?UTF-8?q?=20(#4562)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jackhuang/hmcl/event/EventManager.java | 41 ++++++++++++------- 1 file changed, 27 insertions(+), 14 deletions(-) diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/event/EventManager.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/event/EventManager.java index d0767fc3d..2516e67ff 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/event/EventManager.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/event/EventManager.java @@ -22,6 +22,7 @@ import org.jackhuang.hmcl.util.SimpleMultimap; import java.lang.ref.WeakReference; import java.util.EnumMap; import java.util.concurrent.CopyOnWriteArraySet; +import java.util.concurrent.locks.ReentrantLock; import java.util.function.Consumer; /** @@ -30,6 +31,7 @@ import java.util.function.Consumer; */ public final class EventManager { + private final ReentrantLock lock = new ReentrantLock(); private final SimpleMultimap, CopyOnWriteArraySet>> handlers = new SimpleMultimap<>(() -> new EnumMap<>(EventPriority.class), CopyOnWriteArraySet::new); @@ -47,9 +49,13 @@ public final class EventManager { register(consumer, EventPriority.NORMAL); } - public synchronized void register(Consumer consumer, EventPriority priority) { - if (!handlers.get(priority).contains(consumer)) - handlers.put(priority, consumer); + public void register(Consumer consumer, EventPriority priority) { + lock.lock(); + try { + handlers.get(priority).add(consumer); + } finally { + lock.unlock(); + } } public void register(Runnable runnable) { @@ -60,23 +66,30 @@ public final class EventManager { register(t -> runnable.run(), priority); } - public synchronized Event.Result fireEvent(T event) { - for (EventPriority priority : EventPriority.values()) { - for (Consumer handler : handlers.get(priority)) - handler.accept(event); + public Event.Result fireEvent(T event) { + lock.lock(); + try { + for (EventPriority priority : EventPriority.values()) { + for (Consumer handler : handlers.get(priority)) + handler.accept(event); + } + } finally { + lock.unlock(); } - if (event.hasResult()) - return event.getResult(); - else - return Event.Result.DEFAULT; + return event.hasResult() ? event.getResult() : Event.Result.DEFAULT; } - public synchronized void unregister(Consumer consumer) { - handlers.removeValue(consumer); + public void unregister(Consumer consumer) { + lock.lock(); + try { + handlers.removeValue(consumer); + } finally { + lock.unlock(); + } } - private class WeakListener implements Consumer { + private final class WeakListener implements Consumer { private final WeakReference> ref; public WeakListener(Consumer listener) {