2012-03-20 83 views
0

我有一個關於鎖的簡單問題。 Process1和Process2是否相同,因爲它們最終鎖定了LongProcess? 謝謝。鎖定相同功能的多個鎖C#.Net

private static readonly object _Locker = new object(); 
public void Process1() 
{ 
    lock(_LockerA){ 
     LongProcess() 
    } 
} 

public void Process2() 
{ 
    if(curType == A) 
     ProcessTypeA(); 
    else if(curtype == B) 
     ProcessTypeB(); 
} 

private static readonly object _LockerA = new object(); 
public void ProcessTypeA() 
{  
    lock(_LockerA){ 
     LongProcess() 
    } 
} 

private static readonly object _LockerB = new object(); 
public void ProcessTypeB() 
{  
    lock(_LockerB){ 
     LongProcess() 
    } 
} 

public void LongProcess() 
{ 
} 

回答

0

不,它們是不一樣的。如果鎖定的對象不是已經存在的鎖,則兩個代碼路徑都將被允許。因此,在Process2curtype == 'b'的情況下,鎖正在使用_LockerB對象。如果嘗試使用_LockerA對象的其他鎖之一,則它們將被允許進入LongProcess

+0

所以我可以說,進程2不同類型的將同時從不同的實例,但內處理一次只能處理同一種類型的數據。謝謝。 – Dreteh 2012-03-20 04:23:08

+0

我已經稍微更新了我的答案,將鎖對象稱爲對象。它與類型無關,而不是用於對鎖的實例。 – 2012-03-20 04:27:20

0

Process1Process2有可能鎖定相同的對象,但它們肯定是不是相同。然而,在同一個調用堆棧內允許鎖定同一個對象(我認爲,很少甚至必須這樣做)(在Process1調用Process2的情況下,也被稱爲遞歸鎖定)。這可能會更好地描述爲,依賴於鎖定。

你的問題是相當然而,模糊的,所以你必須詳細說明你的意思是相同什麼...

+0

所以我可以說,對於process2不同的類型將從不同的實例併發處理,但在同一類型中,一次只能處理一個。謝謝。 – Dreteh 2012-03-20 04:21:34

+0

再次檢查您的代碼。對於_Process2_,'ProcessTypeA'和'ProcessTypeB'應該可以同時運行而不會產生鎖定。 – 2012-03-20 04:27:22

+0

好的。謝謝。我只需要確保沒有兩個TypeA同時得到處理。 – Dreteh 2012-03-20 05:44:59