いくつかのデータを含む2つのハッシュマップを含むクラスがあります。マップ内のデータを毎晩(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()ロジックで進行中の場合、すべてのクラスとすべての「リーダー」をブロックするため、解決策ではありません。