我的项目中有以下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
)来更新它时,没有其他线程应该能够读取或更新 a1
以及添加到的所有 B 类对象(b1
在b2
这种情况下)List<B>
内部对象,a1
直到我完成所有更新a1
。请告诉我如何在这种情况下获得锁?