记一个死锁的处理

1.死锁是怎么发生的?
    账户转账场景:
    假设线程1 做的操作是账户A给账户B转账,先锁住了A账户,接下来试图申请B账户的锁, 
    与此同时线程2 在从账户B给账户A 转账,先锁住了B账户的锁,接下来试图申请A账户的锁。
    两个线程各自持有资源, 然后等待获取对方的资源, 都无法执行下去, 死锁就出现了。 

2.解决思路
    调用System类的identityHashCode方法,拿到方法参数的hashcode值
    
    实际就是对Account(账户)进行资源的排序, 通过 Java 内置的方法,得到Hashcode。 然后按顺序访问。
    如果fromAccount 比较小, 那就先锁住fromAccount, 然后锁住toAccount, 反过来也是类似。

    假设线程1 做的操作是账户A给账户B转账, 先锁住了A账户(假设A的hashcode 比较小), 接下来试图申请B账户的锁,
    与此同时线程2 在从 账户B给账户A 转账, 由于A的hashcode 较小, 这个线程也试图先申请A的锁, 当然它申请不到, 因为已经被线程1持有了, 线程2只能等待
    等到线程1完成操作以后, 线程2才能继续, 死锁就消除了。
    如果两个账号的hashCode 相等怎么办, 没办法,只好引用一个第三方的锁了解决了, 这就是上述代码的else 分支 synchronized(lock) . 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值