2011-03-19 22 views

回答

4

new的情況下,Type無關緊要,該實例。在這種情況下,您正在討論synclock對象:用於鎖定代碼段以防止併發訪問的對象。

使用另一個Type而不是object作爲一個synclock是浪費內存,因爲你不用這個實例用於其他任何事情。

在某些情況下,您可以鎖定另一種類型:何時需要鎖定特定實例。 主要問題是:必須初始化實例才能鎖定它。並且在大多數情況下,您想要通過synclock來啓動實例:)

但是在某些情況下,您可以直接鎖定實例;例如像一本字典(幾乎直接在這種情況下;))。

private Dictionary<string,string> _dictionary = new Dictionary<string,string>(); 

public void AddValue(string key, string value) 
{ 
    lock (((IDictionary)_dictionary).SyncRoot) // SyncRoot recommended 
    { 
     if (!_dictionary.ContainsValue(value)) 
      _dictionary.Add(key, value); 
    } 
} 

但問題是:即使這會的工作,總是問自己:「這不是一個好主意,以創建一個特定的鎖定對象,而不是」?

+1

不錯!我不知道'SyncRoot'屬性。 – 2011-03-19 17:58:00

5

以我的opinon任何引用類型可以被鎖定,爲什麼使用虛擬對象的原因是爲了避免常見的鎖定缺陷:

共同構建體鎖(本), 鎖(typeof運算(的MyType) ),並鎖定 ( 「myLock」)違反此準則:

lock (this) is a problem if the instance can be accessed publicly. 


    lock (typeof (MyType)) is a problem if MyType is publicly 

訪問。

lock("myLock") is a problem because any other code in the process 

使用相同的字符串,將共享相同的鎖 。

3

我很確定你知道那篇文章Lock Statement (C# Reference)

通常,請避免鎖定公開類型或超出代碼控制範圍的實例。共同構建鎖(本),鎖(typeof運算(的MyType))鎖( 「myLock」)違反此準則:

  • 鎖(本)是,如果 實例的問題可以公開訪問。如果MyType是可公開訪問的,
  • 鎖(「myLock」)是因爲在使用相同 串過程中的任何其他 代碼中的問題,將共享相同的 鎖。

最佳做法是定義一個私人對象鎖定,或私有靜態對象變量,以保護共同所有實例的數據。

相關問題