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];

      订阅博客周刊 去订阅

文章归档

文章标签

友情链接

Auther ·HouTiZong
侯体宗的博客
© 2020 zongscan.com
版权所有ICP证 : 粤ICP备20027696号
PHP交流群 也可以扫右边的二维码
侯体宗的博客