我有以下代码:
注意:为了可读性,我尽可能简化了代码。
如果我忘记了任何重要的作品,请告诉我。
public class User(){
private Relations relations;
public User(){
relations = new Relations(this);
}
public getRelations(){
return relations;
}
}
public class Relations(){
private User user;
public Relations(User user){
this.user = user;
}
public synchronized void setRelation(User user2){
Relations relations2 = user2.getRelations();
synchronized(relations2){
storeRelation(user2);
if(!relations2.hasRelation(user))
relations2.setRelation(user);
}
}
public synchronized boolean hasRelation(User user2){
... // Checks if this relation is present in some kind of collection
}
/*Store this relation, unless it is already present*/
private void storeRelation(User user2){
... // Stores this relation in some kind of collection
}
}这个实现应该确保对于所有的x,y关系:
x.user = u_x
y.user = u_y以下不变式成立:
x.hasRelation( u_y ) <=> y.hasRelation( u_x )我相信这对上述的代码有效?
注意:它在setRelation(..)的执行过程当然不成立,
但在那一刻,这两个关系的锁都是
由执行线程持有,所以没有其他线程可以读取
hasRelation(..)涉及的其中一个关系。
假设这持有我相信仍然存在潜在的死锁风险。
那是对的吗?如果是这样,我该如何解决它?
我想我需要以setRelation(..)两种方式自动获取锁。