用于同步的对象类型/实例

时间:2014-06-24 13:26:04

标签: c# multithreading synchronization locking

我已经看到获取锁定时使用的对象的不同变体

  1. 静态私有对象

    public class MyClass
    {
      private static object syncBlock = new object();
    
      private void MyMethod()
      {
          lock (syncBlock)
          {
    
          }
      }
    

    }

  2. 类级私有对象

    public class MyClass
    {
       private object syncBlock = new object();
    
       private void MyMethod()
       {
           lock (syncBlock)
           {
    
           }
       }
    }
    
  3. 使用类型本身

    public class MyClass
    {
       private void MyMethod()
       {
           lock (typeof (MyClass))
           {
    
           }
       }
    }
    
  4. 使用此:

    public class MyClass
    {
       private void MyMethod()
       {
          lock (this)
          {
    
          }
       }
    }
    
  5. 有人可以详细说明每种方案的优缺点,以及在特定情况下是否优先于其他方式。

1 个答案:

答案 0 :(得分:2)

Don't use lock(this)

Don't use lock(typeof(MyClass))

对于static vs instance,它取决于适合您的内容。如果您使用static private object,那么您班级的所有实例都会共享锁定。如果使用非静态的private object,则每个实例都有自己的锁。所以没有利弊,这取决于你需要什么。