Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在拥有的对象上放置锁_C#_.net_Multithreading_Locking - Fatal编程技术网

C# 在拥有的对象上放置锁

C# 在拥有的对象上放置锁,c#,.net,multithreading,locking,C#,.net,Multithreading,Locking,我注意到,在我看到的几乎所有示例中,实例上的锁都是按如下方式使用的 public class Foo { readonly object locker = new Object(); public void DoSomething() { lock(locker) { //... } } public void DoSomethingElse() { lock(locker) { //...

我注意到,在我看到的几乎所有示例中,实例上的锁都是按如下方式使用的

public class Foo {
   readonly object locker = new Object();
   public void DoSomething() {
      lock(locker) {
         //...
      }
   }
   public void DoSomethingElse() {
      lock(locker) {
         //...
      }
   }
}
当多个线程可以访问同一个实例,并且您希望其方法是原子的时,这非常有用


在我的实验中,如果我使用
锁(this)
,而不是使用locker对象,那么它也同样有效。有什么东西我遗漏了吗?或者说完全没问题吗?

问题是你对
这个
没有独占控制权。其他类型也可能锁定对象并造成严重破坏

微软在他们的网页上对这个问题发表了一些看法

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

lock("myLock") is a problem because any other code in the process using the same string, will share the same lock. 
最佳实践是定义要锁定的私有对象或私有对象 静态对象变量,用于保护所有实例共用的数据