java多个锁_在java中自动获取多个锁

我有以下代码:

注意:为了可读性,我尽可能简化了代码。

如果我忘记了任何重要的作品,请告诉我。

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(..)两种方式自动获取锁。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值