gpt4 book ai didi

java - Java 中的共享集合锁定

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:40:52 26 4
gpt4 key购买 nike

我有一个类,其中包含两个带有一些数据的 Hashmap。我想每晚更新/重新加载 map 中的数据(使用 Quartz 作业),并希望在数据刷新过程中锁定所有其他线程以防止读取。

 public class A {

private Map<String, Object> someMap1 = new ConcurrentHashMap<String, Object>();
private Map<String, Object> someMap2 = new ConcurrentHashMap<String, Object>();

public void reloadData() {
someMap1.clear();
someMap2.clear();

// read new data here and re-fill the maps
...
}

public Object getDataFromMap(String key) {
// do some logic here and return data from map
return someObj;
}
}

getDataFromMap() 方法应该可供所有“读取器”线程访问,而不会在数据刷新未进行时发生任何阻塞。

另一方面,reloadData() 方法应等待所有“读取器”完成,然后阻止 map 读取并重新加载数据。

reloadData() 的“同步”修饰符不是解决方案,因为如果它们在 getDataFromMap() 逻辑中进行,它会阻止所有类和所有“读者”。

最佳答案

您的要求非常适合 ReentrantReadWriteLock

    private Map<String, Object> someMap1 = new ConcurrentHashMap<String, Object>();
private Map<String, Object> someMap2 = new ConcurrentHashMap<String, Object>();
private final ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();
private final Lock r = rwl.readLock();
private final Lock w = rwl.writeLock();

public Object getDataFromMap(String key) {
r.lock();
try {
// do some logic here and return data from map
return someObj;
} finally {
r.unlock();
}
}

public void reloadData() {
w.lock();
try {
someMap1.clear();
someMap2.clear();
// read new data here and re-fill the maps
} finally {
w.unlock();
}
}

关于java - Java 中的共享集合锁定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12845061/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com