我一直在研究Lock tree死锁检测算法的一些例子,并且无法弄清楚在这种特殊情况下如何发生死锁:
Thread 1: Thread 2:
lock(A) lock(E)
lock(C) lock(D)
unlock(C) unlock(D)
lock(B) unlock(A)
lock(D) lock(A)
lock(E) lock(C)
unlock(E) unlock(C)
unlock(D) unlock(A)
unlock(B)
unlock(A)
根据我的理解,Lock树看起来应该是这样的:
T1: T2:
/ \
A E A
/ \ | |
C B D C
|
D
|
E
可能是在节点T1处发生死锁:D - E和T2:E - D,因为线程以相反的顺序获取这些锁吗?
我怎么能建议插入一个锁和一个解锁语句来消除死锁?
答案 0 :(得分:0)
线程1执行:锁定(a),锁定(c),解锁(c),锁定(b),锁定(d)
所以现在a,b和d被锁定
线程2:锁定(e),锁定(d)
所以现在e也被锁定,线程2正在等待d解锁
现在线程一个醒来并执行:lock(e)
现在他们被卡住了 -
1等待2解锁e。
2等待1解锁d
避免这种情况的方法之一是一次锁定所需的一切,而不是单独的操作。
答案 1 :(得分:0)
是的,在T2中锁定(E)之前锁定(B)将防止死锁。这称为门锁。