添加缓存性能更优的SyncManager

This commit is contained in:
叁玖领域 2025-10-15 19:14:00 +08:00
parent b52e1d17f3
commit 0521a1b2f0
2 changed files with 69 additions and 0 deletions

View File

@ -0,0 +1,68 @@
package top.r3944realms.lib39.core.sync;
import java.util.Map;
import java.util.Set;
@SuppressWarnings("unused")
public abstract class CachedSyncManager<K, T extends ISyncData<?>> implements ISyncManager<K, T> {
private volatile Set<T> cachedSet;
private volatile int mapSize = -1;
@Override
public Set<T> getSyncSet() {
Map<K, T> 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<K, T> 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<K, T> 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<K, T> syncMap = getSyncMap();
if (syncMap != null) {
syncMap.clear();
}
invalidateCache();
}
}

View File

@ -4,6 +4,7 @@ import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.function.Consumer; import java.util.function.Consumer;
@SuppressWarnings("unused")
public interface ISyncManager<K, T extends ISyncData<?>> { public interface ISyncManager<K, T extends ISyncData<?>> {
/** /**