【问题标题】:what object type/instance to use for synchronization用于同步的对象类型/实例
【发布时间】:2014-06-24 13:26:04
【问题描述】:

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

  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)
          {
    
          }
       }
    }
    

有人可以详细说明每种方法的优缺点是什么,以及在给定场景中是否应该优先考虑其中一种方法。

【问题讨论】:

    标签: c# multithreading synchronization locking


    【解决方案1】:

    Don't uselock(this).

    Don't uselock(typeof(MyClass)) 要么。

    至于static vs instance,就看你适合什么了。如果您使用static private object,则您的类的所有实例都将共享锁。如果您使用非静态的private object,则每个实例都有自己的锁。所以没有优点/缺点,这取决于你需要什么。

    【讨论】:

    • 感谢 ken2k。锁定的整个想法是保护数据免受多个实例的影响。基于此,我们不应该总是有一个静态的。你能提供我们不应该使用静态的任何用例吗?
    • @PaulSnow 当你想修改类型的实例字段/属性时。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-24
    • 1970-01-01
    • 1970-01-01
    • 2018-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多