关于用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回答
-
是刚好进入了两个分支,但是不代表发生死锁,A转给B的时候,进入的是fromHash < toHash,那么先获取from,也就是A的锁。
第二个线程B转给A,fromHash > toHash,先获取to的锁,还是A的锁,所以两个线程都先抢锁A,不会发生死锁。
332020-11-16 -
波粒二象性max
2020-05-13
同样问题,果然有人问了,都是自己没想明白,画下图就可以看出来了
,都是先抢锁A
10 -
紫钰
2020-03-26
我理解的是,转账问题中死锁是因为两个线程都持有两把锁,且两把锁的顺序相反,如果使用hash值比较的话,实际上就是就是将两个线程中持有锁的顺序调整为一致。即两个线程持有锁的顺序都如下
Object lock1,lock2;
synchronized(lock1){
.......(一些操作,比如休眠)
synchronized(lock2){
}
}
这种情况是不会发生死锁的
10 -
慕粉152226940
2020-03-23
你说的这种情况是两个不同的请求,也就是说是在两个不同的线程中,所以不会出现你说的情况。在每一次请求中from和to都是唯一确定的
00
相似问题