object theLock = new object();
...
lock (theLock)
{
...
}
我總是使用new object()
這個,但我想知道:有什麼情況下你會鎖定一個更具體的類型?是否有任何理由鎖定除新對象()以外的東西?
object theLock = new object();
...
lock (theLock)
{
...
}
我總是使用new object()
這個,但我想知道:有什麼情況下你會鎖定一個更具體的類型?是否有任何理由鎖定除新對象()以外的東西?
在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);
}
}
但問題是:即使這會的工作,總是問自己:「這不是一個好主意,以創建一個特定的鎖定對象,而不是」?
以我的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
使用相同的字符串,將共享相同的鎖 。
我很確定你知道那篇文章Lock Statement (C# Reference)。
通常,請避免鎖定公開類型或超出代碼控制範圍的實例。共同構建鎖(本),鎖(typeof運算(的MyType))和鎖( 「myLock」)違反此準則:
最佳做法是定義一個私人對象鎖定,或私有靜態對象變量,以保護共同所有實例的數據。
不錯!我不知道'SyncRoot'屬性。 – 2011-03-19 17:58:00