private static final Object tieLock = new Object();
public void transferMoney(final Account fromAcct,final Account toAcct,final DollarAmount amount)throws InsufficientFundsException{
class Helper{
public void transfer() throws InsufficientFundsException{
if(fromAcct.getBalance().compareTo(amount) < 0){.
throws new InsufficientFundsException();
}else{
fromAcct.debit(amount);
toAcct.credit(amount);
}
}
}
int fromHash = System.identityHashCode(fromAcct);
int toHash = System.identityHashCode(toAcct);
if(fromHash < toHash){
synchronized(fromAcct){
synchronized(toAcct){
new Helper().transfer();
}
}
}else if(fromHash > toHash){
synchronized(toAcct){
synchronized(fromAcct){
new Helper().transfer();
}
}
}else{
synchronized(tieLock){
synchronized(fromAcct){
synchronized(toAcct){
new Helper().transfer();
}
}
}
}
}
锁顺序避免死锁
最新推荐文章于 2024-04-08 22:47:07 发布
这篇博客探讨了一种并发控制策略,用于在银行转账操作中避免死锁。通过使用哈希值比较和特定的锁顺序,代码确保了同一时间只有一个线程可以执行转账,从而防止了资源竞争可能导致的死锁问题。此外,还引入了一个专门的`tieLock`对象,用于处理相等哈希值的情况,进一步确保了并发安全性。
954

被折叠的 条评论
为什么被折叠?



