缓存加载新增线程安全变量
All checks were successful
Java CI-CD with Maven / build (push) Successful in 22m45s

This commit is contained in:
zhangyuheng 2024-04-15 19:44:45 +08:00
parent f163a19b8b
commit 3de81817fa
2 changed files with 19 additions and 17 deletions

View File

@ -6,7 +6,7 @@
<groupId>cn.lunadeer</groupId> <groupId>cn.lunadeer</groupId>
<artifactId>Dominion</artifactId> <artifactId>Dominion</artifactId>
<version>1.17.0-beta</version> <version>1.17.1-beta</version>
<packaging>jar</packaging> <packaging>jar</packaging>
<name>Dominion</name> <name>Dominion</name>

View File

@ -12,6 +12,8 @@ import javax.annotation.Nullable;
import java.util.*; import java.util.*;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicLong;
public class Cache { public class Cache {
@ -25,19 +27,19 @@ public class Cache {
* 从数据库加载所有领地 * 从数据库加载所有领地
*/ */
public void loadDominions() { public void loadDominions() {
if (_last_update_dominion + UPDATE_INTERVAL < System.currentTimeMillis()) { if (_last_update_dominion.get() + UPDATE_INTERVAL < System.currentTimeMillis()) {
XLogger.debug("run loadDominionsExecution directly"); XLogger.debug("run loadDominionsExecution directly");
loadDominionsExecution(); loadDominionsExecution();
} else { } else {
if (_update_dominion_is_scheduled) return; if (_update_dominion_is_scheduled.get()) return;
XLogger.debug("schedule loadDominionsExecution"); XLogger.debug("schedule loadDominionsExecution");
_update_dominion_is_scheduled = true; _update_dominion_is_scheduled.set(true);
Dominion.scheduler.async.runDelayed(Dominion.instance, (instance) -> { Dominion.scheduler.async.runDelayed(Dominion.instance, (instance) -> {
XLogger.debug("run loadDominionsExecution scheduled"); XLogger.debug("run loadDominionsExecution scheduled");
loadDominionsExecution(); loadDominionsExecution();
_update_dominion_is_scheduled = false; _update_dominion_is_scheduled.set(false);
}, },
UPDATE_INTERVAL - (System.currentTimeMillis() - _last_update_dominion), UPDATE_INTERVAL - (System.currentTimeMillis() - _last_update_dominion.get()),
TimeUnit.MILLISECONDS); TimeUnit.MILLISECONDS);
} }
} }
@ -64,23 +66,23 @@ public class Cache {
} }
} }
BlueMapConnect.render(); BlueMapConnect.render();
_last_update_dominion = System.currentTimeMillis(); _last_update_dominion.set(System.currentTimeMillis());
} }
/** /**
* 从数据库加载所有玩家特权 * 从数据库加载所有玩家特权
*/ */
public void loadPlayerPrivileges() { public void loadPlayerPrivileges() {
if (_last_update_privilege + UPDATE_INTERVAL < System.currentTimeMillis()) { if (_last_update_privilege.get() + UPDATE_INTERVAL < System.currentTimeMillis()) {
loadPlayerPrivilegesExecution(); loadPlayerPrivilegesExecution();
} else { } else {
if (_update_privilege_is_scheduled) return; if (_update_privilege_is_scheduled.get()) return;
_update_privilege_is_scheduled = true; _update_privilege_is_scheduled.set(true);
Dominion.scheduler.async.runDelayed(Dominion.instance, (instance) -> { Dominion.scheduler.async.runDelayed(Dominion.instance, (instance) -> {
loadPlayerPrivilegesExecution(); loadPlayerPrivilegesExecution();
_update_privilege_is_scheduled = false; _update_privilege_is_scheduled.set(false);
}, },
UPDATE_INTERVAL - (System.currentTimeMillis() - _last_update_privilege), UPDATE_INTERVAL - (System.currentTimeMillis() - _last_update_privilege.get()),
TimeUnit.MILLISECONDS); TimeUnit.MILLISECONDS);
} }
} }
@ -99,7 +101,7 @@ public class Cache {
} }
player_uuid_to_privilege.get(player_uuid).put(privilege.getDomID(), privilege); player_uuid_to_privilege.get(player_uuid).put(privilege.getDomID(), privilege);
} }
_last_update_privilege = System.currentTimeMillis(); _last_update_privilege.set(System.currentTimeMillis());
} }
/** /**
@ -263,9 +265,9 @@ public class Cache {
private ConcurrentHashMap<UUID, ConcurrentHashMap<Integer, PlayerPrivilegeDTO>> player_uuid_to_privilege; // 玩家所有的特权 private ConcurrentHashMap<UUID, ConcurrentHashMap<Integer, PlayerPrivilegeDTO>> player_uuid_to_privilege; // 玩家所有的特权
private final Map<UUID, Integer> player_current_dominion_id; // 玩家当前所在领地 private final Map<UUID, Integer> player_current_dominion_id; // 玩家当前所在领地
private ConcurrentHashMap<Integer, List<Integer>> dominion_children; private ConcurrentHashMap<Integer, List<Integer>> dominion_children;
private long _last_update_dominion = 0; private final AtomicLong _last_update_dominion = new AtomicLong(0);
private boolean _update_dominion_is_scheduled = false; private final AtomicBoolean _update_dominion_is_scheduled = new AtomicBoolean(false);
private long _last_update_privilege = 0; private final AtomicLong _last_update_privilege = new AtomicLong(0);
private boolean _update_privilege_is_scheduled = false; private final AtomicBoolean _update_privilege_is_scheduled = new AtomicBoolean(false);
private static final long UPDATE_INTERVAL = 1000 * 4; private static final long UPDATE_INTERVAL = 1000 * 4;
} }