1 回答

TA貢獻1816條經驗 獲得超6個贊
您提供的代碼確實會導致死鎖。最初, 獲取 的固有鎖,并獲取 的鎖。然后嘗試在仍然持有鎖的同時獲取鎖。由于鎖由 持有,將阻止等待鎖被釋放。類似的情況發生在:它嘗試在仍然持有鎖的同時獲取鎖。由于鎖由 持有,因此也會阻塞。這會導致僵局。t1s1t2s2t1s2s1s2t2t1t2s1s2s1t1t2
要解決此問題,兩個線程應僅使用一個鎖來同步其工作。一個可能的解決方案是:
class Shared
{
private static final Object LOCK = new Object();
// first synchronized method
void test1(Shared s2)
{
synchronized (LOCK) {
System.out.println("test1-begin");
Util.sleep(1000);
// taking object lock of s2 enters
// into test2 method
s2.test2(this);
System.out.println("test1-end");
}
}
// second synchronized method
void test2(Shared s1)
{
synchronized (LOCK) {
System.out.println("test2-begin");
Util.sleep(1000);
// taking object lock of s1 enters
// into test1 method
s1.test1(this);
System.out.println("test2-end");
}
}
}
這將修復死鎖。但是,考慮到當前的實現,它將導致間接遞歸引起的無限循環:->->->->...s1.test1(s2)s2.test2(s1)s1.test1(s2)s2.test2(s1)
添加回答
舉報