采纳答案成功!
向帮助你的同学说点啥吧!感谢那些助人为乐的人
老师,这里你在视频里讲的当两人互相转的时候,总有人先拿到from我有点不太懂。比如A(哈希值1)向B(哈希值5)转账,B也向A转账。那么A–>B的时候A是from,B是to,就有fromHash < toHash。B–>A的时候B是from,A是to,就有fromHash > toHash。这不就刚好进入了两个分支,产生死锁了吗?
是刚好进入了两个分支,但是不代表发生死锁,A转给B的时候,进入的是fromHash < toHash,那么先获取from,也就是A的锁。
第二个线程B转给A,fromHash > toHash,先获取to的锁,还是A的锁,所以两个线程都先抢锁A,不会发生死锁。
老师一句话顶自己想半天
那老师、如果第二个线程B转给A,还是fromHash < toHash,那不也会先获取from,也就是B的锁呀
第二个线程B转给A,进入的不是fromHash < toHash,而是fromHash > toHash,先获取to的锁,还是A的锁
同样问题,果然有人问了,都是自己没想明白,画下图就可以看出来了
,都是先抢锁A
我理解的是,转账问题中死锁是因为两个线程都持有两把锁,且两把锁的顺序相反,如果使用hash值比较的话,实际上就是就是将两个线程中持有锁的顺序调整为一致。即两个线程持有锁的顺序都如下
Object lock1,lock2;
synchronized(lock1){
.......(一些操作,比如休眠)
synchronized(lock2){
}
这种情况是不会发生死锁的
你说的这种情况是两个不同的请求,也就是说是在两个不同的线程中,所以不会出现你说的情况。在每一次请求中from和to都是唯一确定的
登录后可查看更多问答,登录/注册
完整的并发知识网络+丰富的工作内容分享+50余道并发高频面试题
1.9k 26
914 12
1.1k 12
2.5k 12
1.1k 11