2010-08-17 54 views
2

假設我有兩個對象abSyncLock on two objects

我想在這兩個對象上使用SyncLock。

這可行嗎?它可以通過嵌套的SyncLock語句完成嗎?這種手術有什麼危險?

編輯

也許我應該問,怎麼能一個重構,以避免死鎖?

回答

0

可以這樣做,但您需要考慮如果運行此代碼的兩個線程同時嘗試同時獲取兩個鎖,會發生什麼情況 - 例如,如果線程1對對象1鎖定並且線程2鎖定對象2 ?提示死鎖。

有人比我可以給你一些示例代碼,應該是安全的:)

4

嵌套鎖將工作 - 但是危險之一是一個需要始終鎖定在同一順序的對象,否則一個可能導致僵局。


編輯: 要回答第二個問題周圍試圖力鎖的正確順序:

一個可能的解決方案,以避免這種情況可能是鎖定封裝成這樣一個共同的鎖方法:

public void LockAndDoWork(Action action) 
{ 
lock(lockObject1) 
{ 
    lock(lockObject2) 
    { 
    action(); 
    } 
} 
} 

這然後可以使用這樣的:

Thread1: LockAndDoWork(() => {do some work....}); 
Thread2: LockAndDoWork(() => {do some other work...}); 

這可以幫助避免這種潛在的問題 - 這是特別有用的,如果一個能限制的知名度,從客戶端代碼

+0

儘管這是c#,你可以在VB.Net中做同樣的事情 – saret 2010-08-17 16:13:19

1

也許我應該問那些對象,怎麼能一個重構,以避免死鎖?

定義所有同步鎖在優先的強勢整理並始終以最高優先級。

這很難:當一個擁有較低優先級鎖的代碼塊可以調用需要佔用較高優先級鎖的幫助代碼時,將需要進行重大重構。