|
|
@@ -17,6 +17,7 @@ import java.time.LocalDateTime;
|
|
|
import java.util.List;
|
|
|
import java.util.Map;
|
|
|
import java.util.Set;
|
|
|
+import java.util.concurrent.locks.ReentrantReadWriteLock;
|
|
|
|
|
|
/**
|
|
|
* CaseDataCache 类用于缓存应用程序运行过程中的数据,
|
|
|
@@ -35,7 +36,10 @@ public class CaseDataCache {
|
|
|
*/
|
|
|
public static final HashMultimap<String, String> PERSON_LIB_NO_MAP = HashMultimap.create();
|
|
|
public static final Map<String, String> GOVERN_CONFIG = Maps.newConcurrentMap();
|
|
|
- private static final Object lock = new Object();
|
|
|
+ // 使用 ReentrantReadWriteLock 替代单一的 Object 锁
|
|
|
+ private static final ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock();
|
|
|
+ private static final ReentrantReadWriteLock.ReadLock readLock = rwLock.readLock();
|
|
|
+ private static final ReentrantReadWriteLock.WriteLock writeLock = rwLock.writeLock();
|
|
|
|
|
|
public static void initCache() {
|
|
|
PERSON_LIB_NO_MAP.clear();
|
|
|
@@ -56,19 +60,28 @@ public class CaseDataCache {
|
|
|
* 新增人员库
|
|
|
*/
|
|
|
public static void putPerLib(String key, String value, String bankName) {
|
|
|
- synchronized (lock) {
|
|
|
+ // 获取写锁
|
|
|
+ writeLock.lock();
|
|
|
+ try {
|
|
|
PERSON_LIB_NO_MAP.put(key, value);
|
|
|
String[] keys = StrUtil.splitToArray(key, StrPool.UNDERLINE);
|
|
|
CleanCache.addPersonLibNo(new PersonLibNo(keys[0], value, Integer.parseInt(keys[1]), 1, bankName));
|
|
|
+ } finally {
|
|
|
+ // 必须在 finally 块中释放锁,确保即使发生异常也能正确释放
|
|
|
+ writeLock.unlock();
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
public static synchronized void putPerLib(String key, String value, LocalDateTime startTime, LocalDateTime endTime, String operatorId) {
|
|
|
- synchronized (lock) {
|
|
|
+ // 获取写锁
|
|
|
+ writeLock.lock();
|
|
|
+ try {
|
|
|
PERSON_LIB_NO_MAP.put(key, value);
|
|
|
String[] keys = StrUtil.splitToArray(key, StrPool.UNDERLINE);
|
|
|
CleanCache.addPersonLibNo(new PersonLibNo(keys[0], value, Integer.parseInt(keys[1]), startTime, endTime, operatorId));
|
|
|
+ } finally {
|
|
|
+ writeLock.unlock();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -87,8 +100,10 @@ public class CaseDataCache {
|
|
|
}
|
|
|
|
|
|
public static String findPersonVal(String val) {
|
|
|
- if (PERSON_LIB_NO_MAP.containsValue(val)) {
|
|
|
- synchronized (lock) {
|
|
|
+ // 获取读锁
|
|
|
+ readLock.lock();
|
|
|
+ try {
|
|
|
+ if (PERSON_LIB_NO_MAP.containsValue(val)) {
|
|
|
for (Map.Entry<String, String> entry : PERSON_LIB_NO_MAP.entries()) {
|
|
|
String key = entry.getKey();
|
|
|
String value = entry.getValue();
|
|
|
@@ -98,8 +113,10 @@ public class CaseDataCache {
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
+ return null;
|
|
|
+ } finally {
|
|
|
+ readLock.unlock();
|
|
|
}
|
|
|
- return null;
|
|
|
}
|
|
|
|
|
|
public static void cleanCache() {
|