我有一个类,其中包含两个带有一些数据的哈希图。我想每晚更新/重新加载地图中的数据(使用 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() 方法应该等待所有“读取器”完成,然后阻止地图读取并重新加载数据。
reloadData() 的“同步”修饰符不是解决方案,因为它会阻止所有类和所有“阅读器”(如果它们在 getDataFromMap() 逻辑中正在进行)。