有没有理由锁定除new object()之外的东西?

时间:2011-03-19 09:33:12

标签: c# .net locking parallel-processing

object theLock = new object();

...


lock (theLock)
{
    ...
}

我总是使用new object(),但我想知道:在任何情况下你会锁定更具体的类型吗?

3 个答案:

答案 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”)违反了此准则:

  • lock(this)是一个问题,如果 实例可以公开访问。
  • lock(typeof(MyType))是个问题 如果 MyType 可公开访问。
  • lock(“myLock”)是一个问题,因为任何问题 使用过程中的其他代码 相同的字符串,将共享相同 锁。

最佳做法是定义要锁定的私有对象,或者私有静态对象变量,以保护所有实例共有的数据。