From 0521a1b2f0a631cde617aa3037bf2e89ae976d11 Mon Sep 17 00:00:00 2001 From: 3944Realms Date: Wed, 15 Oct 2025 19:14:00 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=BC=93=E5=AD=98=E6=80=A7?= =?UTF-8?q?=E8=83=BD=E6=9B=B4=E4=BC=98=E7=9A=84SyncManager?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lib39/core/sync/CachedSyncManager.java | 68 +++++++++++++++++++ .../lib39/core/sync/ISyncManager.java | 1 + 2 files changed, 69 insertions(+) create mode 100644 src/main/java/top/r3944realms/lib39/core/sync/CachedSyncManager.java diff --git a/src/main/java/top/r3944realms/lib39/core/sync/CachedSyncManager.java b/src/main/java/top/r3944realms/lib39/core/sync/CachedSyncManager.java new file mode 100644 index 0000000..5a64c1d --- /dev/null +++ b/src/main/java/top/r3944realms/lib39/core/sync/CachedSyncManager.java @@ -0,0 +1,68 @@ +package top.r3944realms.lib39.core.sync; + +import java.util.Map; +import java.util.Set; + +@SuppressWarnings("unused") +public abstract class CachedSyncManager> implements ISyncManager { + + private volatile Set cachedSet; + private volatile int mapSize = -1; + + @Override + public Set getSyncSet() { + Map syncMap = getSyncMap(); + if (syncMap == null) { + throw new IllegalStateException("SyncMap is not initialized"); + } + + // 检查是否需要更新缓存 + if (cachedSet == null || mapSize != syncMap.size()) { + synchronized (this) { + if (cachedSet == null || mapSize != syncMap.size()) { + cachedSet = Set.copyOf(syncMap.values()); + mapSize = syncMap.size(); + } + } + } + return cachedSet; + } + + /** + * 当Map发生变化时调用此方法清除缓存 + */ + protected void invalidateCache() { + cachedSet = null; + mapSize = -1; + } + + @Override + public void track(K key, T instance) { + Map syncMap = getSyncMap(); + if (syncMap == null) { + throw new IllegalStateException("SyncMap is not initialized"); + } + syncMap.put(key, instance); + invalidateCache(); + } + + @Override + public void untrack(K key, T instance) { + Map syncMap = getSyncMap(); + if (syncMap == null) { + throw new IllegalStateException("SyncMap is not initialized"); + } + // 只有当key对应的value确实是instance时才移除,避免误删 + syncMap.remove(key, instance); + invalidateCache(); + } + + @Override + public void clear() { + Map syncMap = getSyncMap(); + if (syncMap != null) { + syncMap.clear(); + } + invalidateCache(); + } +} \ No newline at end of file diff --git a/src/main/java/top/r3944realms/lib39/core/sync/ISyncManager.java b/src/main/java/top/r3944realms/lib39/core/sync/ISyncManager.java index 9ae3085..f0b0a2a 100644 --- a/src/main/java/top/r3944realms/lib39/core/sync/ISyncManager.java +++ b/src/main/java/top/r3944realms/lib39/core/sync/ISyncManager.java @@ -4,6 +4,7 @@ import java.util.Map; import java.util.Set; import java.util.function.Consumer; +@SuppressWarnings("unused") public interface ISyncManager> { /**