object theLock = new object();
...
lock (theLock)
{
...
}
我总是使用new object()
,但我想知道:在任何情况下你会锁定更具体的类型吗?
答案 0 :(得分:5)
在我看来,任何引用类型都可以被锁定,使用虚拟对象的原因是为了避免常见的锁定陷阱:
常见的构造锁定(this), 锁定(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
使用相同的字符串,将共享 同样的锁。
答案 1 :(得分: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);
}
}
但重点是:即使这样可行,也要问自己:“创建一个特定的锁定对象不是更好的主意吗?”
答案 2 :(得分:3)
我很确定你知道那篇文章Lock Statement (C# Reference)。
通常,请避免锁定公开类型或超出代码控制范围的实例。常见的构造 lock(this),lock(typeof(MyType))和 lock(“myLock”)违反了此准则:
最佳做法是定义要锁定的私有对象,或者私有静态对象变量,以保护所有实例共有的数据。