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) .