锁(X)vs锁(typeof(X))

Fir*_*gon 17 c# multithreading locking thread-safety

锁定类的类型与类本身的锁定有什么区别?

例如:

private readonly object xmpp = new object();

lock (xmpp)
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

VS

lock (typeof(Xmpp))
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

seh*_*ehe 19

  • lock(x) 为每个类型的实例同步一个不同的锁

  • lock(typeof(X)) 为该类型的所有实例同步锁定

始终锁定私有锁对象:

 public class X
 {
      private readonly Object _lock = new Object();

      // ...
            lock (_lock)
            {
            }
Run Code Online (Sandbox Code Playgroud)

如果必须同步对类静态成员的访问,请使用相同的模式:

 public class X
 {
      private readonly static Object s_lock = new Object();
Run Code Online (Sandbox Code Playgroud)

  • 我只想指出为什么你应该总是使用私有锁对象...因为只有你的类和代码才能访问该锁对象,如果你锁定一些公开访问的东西,别人可能会锁定你的对象并破坏你的代码.这真的只适用于编写第三方库时,但这是一个良好的模式和良好习惯,可以进入任何地方. (5认同)
  • 为了清楚起见,我还建议将`readonly`关键字添加到锁定对象中.并不是说你会故意分配一个值,*但是*那些错误总是很有趣. (4认同)