java-解决动态的锁顺序死锁
编程技术  /  houtizong 发布于 3年前   53
我们可以制定锁的顺序,并在整个应用程序中,获得锁都必须始终遵守这个既定的顺序。我们在制定对象顺序的时候,可以使用System.identityHashCode这样一种方式,它会返回Object.hashcode所返回的值。
在极少数的情况下,2个对象具有相同的哈希码,我们必须使用任意的中数来决定锁的顺序,这又重新引入了死锁的可能性。使用另一个锁,在获得2个对象的锁之前,就要获得这个锁
以下程序完成把MONEY从一个帐户转到另一帐户
private static final Object tieLock=new Object();
public void transferMoney(final Account fromAcct,final AccounttoAcct,final DollarAmount amount) throwsInsufficientFundsException{
classHelper{
public void transfer() throws InsufficientFundsException{
if(fromAcct.getBalance().compareTo(amount)<0)
throw new InsufficientFundsException();
else{
fromAcct.debit(amount);
toAcct.credit(amount);
}
}
}
intfromHash=System.identityHashCode(fromAcct);
inttoHash=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 (toAcct){
synchronized (fromAcct){
new Helper.transfer();
}
}
}
}
}
请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!
技术博客集 - 网站简介:
前后端技术:
后端基于Hyperf2.1框架开发,前端使用Bootstrap可视化布局系统生成
网站主要作用:
1.编程技术分享及讨论交流,内置聊天系统;
2.测试交流框架问题,比如:Hyperf、Laravel、TP、beego;
3.本站数据是基于大数据采集等爬虫技术为基础助力分享知识,如有侵权请发邮件到站长邮箱,站长会尽快处理;
4.站长邮箱:[email protected];
文章归档
文章标签
友情链接