在拥有对象上放置一个锁

时间:2016-05-19 23:04:35

标签: c# .net multithreading locking

在几乎所有的例子中我都注意到我看到实例上的锁使用如下

public class Foo {
   readonly object locker = new Object();
   public void DoSomething() {
      lock(locker) {
         //...
      }
   }
   public void DoSomethingElse() {
      lock(locker) {
         //...
      }
   }
}

当多个线程可以访问同一个实例并且您希望其方法相对于彼此原子时,这非常有用。

在我的实验中,如果我做了lock(this)而不是拥有更衣室对象,那么它也会起作用。有什么东西我缺少或完全没问题吗?

1 个答案:

答案 0 :(得分:1)

问题是您没有对this的独占控制权。其他类型也可以锁定您的对象并造成破坏。

微软在其关于lock statement的网页上有相关内容。

  

一般情况下,避免锁定公共类型或超出您的实例   代码的控制。常见的构造锁定(this),锁定(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 accessible.

lock("myLock") is a problem because any other code in the process using the same string, will share the same lock. 
     

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