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> { /**