请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

关于用fromHash和toHash解决死锁的一个疑问

图片描述
老师,这里你在视频里讲的当两人互相转的时候,总有人先拿到from我有点不太懂。比如A(哈希值1)向B(哈希值5)转账,B也向A转账。那么A–>B的时候A是from,B是to,就有fromHash < toHash。B–>A的时候B是from,A是to,就有fromHash > toHash。这不就刚好进入了两个分支,产生死锁了吗?

正在回答

4回答

是刚好进入了两个分支,但是不代表发生死锁,A转给B的时候,进入的是fromHash < toHash,那么先获取from,也就是A的锁。

第二个线程B转给A,fromHash > toHash,先获取to的锁,还是A的锁,所以两个线程都先抢锁A,不会发生死锁。

3 回复 有任何疑惑可以回复我~
  • 提问者 慕粉115915463 #1
    老师一句话顶自己想半天
    回复 有任何疑惑可以回复我~ 2020-03-23 10:42:48
  • 那老师、如果第二个线程B转给A,还是fromHash < toHash,那不也会先获取from,也就是B的锁呀
    回复 有任何疑惑可以回复我~ 2020-11-13 17:05:59
  • 悟空 回复 qq_厭迣o_0 #3
    第二个线程B转给A,进入的不是fromHash < toHash,而是fromHash > toHash,先获取to的锁,还是A的锁
    回复 有任何疑惑可以回复我~ 2020-11-16 00:12:06
波粒二象性max 2020-05-13 15:10:24

同样问题,果然有人问了,都是自己没想明白,画下图就可以看出来了

,都是先抢锁A

https://img1.sycdn.imooc.com//szimg/5ebb9d0c093a6f9017621206.jpg

1 回复 有任何疑惑可以回复我~
紫钰 2020-03-26 22:50:25

我理解的是,转账问题中死锁是因为两个线程都持有两把锁,且两把锁的顺序相反,如果使用hash值比较的话,实际上就是就是将两个线程中持有锁的顺序调整为一致。即两个线程持有锁的顺序都如下

Object lock1,lock2;

synchronized(lock1){

    .......(一些操作,比如休眠)

    synchronized(lock2){

    }

}

这种情况是不会发生死锁的

1 回复 有任何疑惑可以回复我~
慕粉152226940 2020-03-23 00:18:47

你说的这种情况是两个不同的请求,也就是说是在两个不同的线程中,所以不会出现你说的情况。在每一次请求中from和to都是唯一确定的

0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信