2014-02-21 23 views
0

我是否冒着下面的代碼發生死鎖的風險?有沒有更好/更安全的方法?起初,我想過把兩個鎖合併成一個,但是我可能在這裏推動太多,下面的代碼是安全和正確的。是否有可能使用兩個鎖死鎖,只有一個方法獲取兩個鎖而其他所有方法只獲取一個?

public void method1() { 

    lock1.lock(); 
    //... 
    lock1.unlock(); 
} 

public void method2() { 
    lock2.lock(); 
    //... 
    lock2.unlock(); 
} 

public void method3() { 
    lock1.lock(); 
    lock2.lock(); 
    // ... 
    lock2.unlock(); 
    lock1.unlock(); 
} 
+2

這應該永遠不會死鎖,沒有。死鎖只會發生在2個線程中,每個線程獲得2個或更多鎖定。 – Gray

+0

@Gary能否提供一個使用上面的例子來解決死鎖的例子? –

+0

你明白什麼是僵局嗎?你懷疑你的代碼在哪裏? –

回答

2

在這種情況下,method3不能有lock2鎖定無鎖定lock1,所以僵局不能在方法發生。請注意,這並不妨礙某種未顯示lock1之前收購lock2額外的代碼,如

public void method4() { 
    lock2.lock(); 
    lock1.lock(); 
    // ... 
    lock1.unlock(); 
    lock2.unlock(); 
} 

此,當method3同時運行會產生死鎖。

相關問題