2011-11-17 152 views
3

我面臨的情況,迫使我鎖定實例對象內的鎖對象,我想知道它是真的還是不是?實例對象內的C#鎖對象

爲澄清:

public class classA 
{ 
    object objLock = new object(); 
    public void MethodA(object objClassA) 
    { 
     classA cls = (classA)objClassA; 
     lock(cls.objLock) 
     { 
      Do something with cls 
     } 
    } 
} 

是允許這樣做嗎?

+1

你在做什麼是語法上合法的,但代碼看起來很可疑。 – Kit

回答

2

這很好。這是合法的C#。事實上,這是首選的方式,而不是鎖定這個。由於這個可以從類而objLock是私人只能在類內鎖定外面被鎖住,讓你更好地控制和避免一些死鎖情況

然而鑄造可能會拋出異常。您可能想要處理該場景

+0

是不是這樣,因爲他鎖定了一個不同實例中的對象,以至於他仍然可能遇到死鎖問題(即在另一個實例中鎖定私有變量與鎖定「this」實際上沒有區別)?由於提到的其他答案確實沒有外部代碼應該鎖定類(或類本身)中的對象,即使這些外部對象是同一類的實例。 –

+0

我的大問題是關於死鎖。但我發現使用線程同步可以解決這個問題。在我的問題中「用cls做什麼」是在while循環中。 – amir110

5

您鎖定的對象在同一個類中,但是是不同的實例。從這個意義上說,你不打破封裝,但你仍然應該更喜歡提取代碼,以便防止鎖定外部對象。下面是一個例子:

public class classA 
{ 
    private readonly object objLock = new object(); 

    public void MethodA(object objClassA) 
    { 
     classA cls = (classA)objClassA; 

     cls.DoSomething(); 
    } 

    private void DoSomething() 
    { 
     lock (this.objLock) 
     { 
      Do something with cls 
     } 
    } 
}