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

来源:14-11 换序避免

慕粉115915463

2020-03-22

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

写回答

4回答

悟空

2020-03-23

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

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

3
3
悟空
回复
qq_厭迣o_0
第二个线程B转给A,进入的不是fromHash < toHash,而是fromHash > toHash,先获取to的锁,还是A的锁
2020-11-16
共3条回复

波粒二象性max

2020-05-13

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

,都是先抢锁A

//img.mukewang.com/szimg/5ebb9d0c093a6f9017621206.jpg

1
0

紫钰

2020-03-26

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

Object lock1,lock2;

synchronized(lock1){

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

    synchronized(lock2){

    }

}

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

1
0

慕粉152226940

2020-03-23

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

0
0

线程八大核心+Java并发原理及企业级并发解决方案

完整的并发知识网络+丰富的工作内容分享+50余道并发高频面试题

2512 学习 · 939 问题

查看课程