クラス Aとクラス Bのプロジェクトには、以下のクラス構造があります。
class A {
private String id;
private List<B> bs = new ArrayList<B>();
A(String id){
this.id = id;
}
public List<B> getBs(){
return bs;
}
public void setBs(List<B> bs){
this.bs=bs;
}
public void addBs(List<B> bs){
this.bs.addAll(bs);
}
public void addB(B b){
this.bs.add(b);
}
}
class B {
private String id;
private List<String> tags;
B(String id){
this.id = id;
}
public List<String> getTags(){
return tags;
}
public void setTags(List<String> tags){
this.tags = tags;
}
public void addTags(List<String> tags){
this.tags.addAll(tags);
}
public void addTag(String tag){
this.tags.add(tag);
}
}
また、キャッシュ クラスもあります。
class CacheService {
private static final ConcurrentHashMap<String, Object> CACHE = new ConcurrentHashMap<String, Object>();
public static Object get(String id){
return CACHE.get(id);
}
public static void put(String id, Object obj){
return CACHE.put(id, obj);
}
}
クラス A と B のオブジェクトは一意の ID を使用して作成され、<id, object> の組み合わせでこのキャッシュに入れられます。例えば:
A a1 = new A("10");
CacheService.put("10", a1);
A a2 = new A("11");
CacheService.put("11", a2);
B b1 = new B("1");
CacheService.put("1", b1);
B b2 = new B("2");
CacheService.put("2", b2);
B b3 = new B("3");
CacheService.put("3", b3);
B b4 = new B("4");
CacheService.put("4", b4);
また、クラス B オブジェクトをList<B>
内側のオブジェクトa1
とに入れていますa2
。一意の B オブジェクトは、任意の A オブジェクトに一度だけ配置されることに注意することが重要です。
a1.add(b1);
a1.add(b2);
a2.add(b3);
a2.add(b4);
このようにして、CACHE にクラス A と B の複数のオブジェクトを含めることができます。
シナリオ:複数のスレッドがこの CACHE にアクセスしますが、ユーザーが指定した ID に応じて、一部のスレッドはクラス A オブジェクトを取得し、他のスレッドはクラス B オブジェクトを取得します。これらのスレッドは、実際にはこれらのオブジェクトに関する情報を読み取ったり更新したりしたいと考えています。
質問:私の要件は、スレッドがクラス A のオブジェクト (たとえばa1
) にアクセスしてそれを更新した場合、他のスレッドがすべてのクラス B オブジェクト (およびこの場合)と同様に読み取りまたは更新 できないようにすることです。のすべての更新が完了するまで、内側のオブジェクト。このシナリオでロックを取得する方法を教えてください。a1
b1
b2
List<B>
a1
a1