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

object theLock = new object(); ... lock (theLock) { ... } 

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

如果是newType无关紧要,实例也可以。 在这种情况下,您所说的是一个synclock对象:一个用于锁定代码段以防止并发访问的对象。

对于synclock使用另一个Type不是object是浪费内存,因为您不将此实例用于其他任何事情。

在某些情况下,您可以锁定其他类型:何时需要锁定特定实例。 主要问题是:必须初始化实例才能锁定它。 在大多数情况下,您希望synclock实例的启动:)

但在某些情况下,您可以直接锁定实例; 比如字典(在这种情况下几乎直接;))。

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

但问题是:即使这样可行,也总是问自己:“创建一个特定的锁定对象不是一个更好的主意”吗?

在我看来,任何引用类型都可以被锁定,使用虚拟对象的原因是为了避免常见的锁定陷阱:

常见的构造锁(this),lock(typeof(MyType))和lock(“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) 。

通常,避免锁定公共类型或超出代码控制范围的实例。 常见的构造锁(this),lock(typeof(MyType))lock(“myLock”)违反了这个准则:

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

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