C#中的锁变量

Sey*_*avi 1 c# multithreading design-patterns

我知道何时在C#中使用锁定块,但我不清楚的是lock variable在lock语句的括号中.请考虑Singleton Design PatternDoFactory进行以下操作:

class LoadBalancer
{
   private static LoadBalancer _instance;
   private List<string> _servers = new List<string>();
   private static object syncLock = new object();
   public static LoadBalancer GetLoadBalancer()
   {
   // Support multithreaded applications through
   // 'Double checked locking' pattern which (once
   // the instance exists) avoids locking each
   // time the method is invoked
   if (_instance == null)
   {
    lock (syncLock)
    {
      if (_instance == null)
      {
        _instance = new LoadBalancer();
      }
    }
   }

  return _instance;
 }
}
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,我无法理解为什么我们不使用_instancelock变量而不是`syncLock?

Jon*_*eet 12

在上面的代码中,我无法理解为什么我们不使用_instance来锁定变量而不是`syncLock?

好吧,你会试图锁定一个空引用,一方面......

此外,你将通过可变字段锁定,这是一个坏主意.(如果字段改变了值,那么另一个线程可以进入相同的代码.不是很好.)通过readonly字段锁定通常是一个好主意.

此外,您将锁定一个引用,该引用也会返回给调用者,这些调用者可以持续锁定任意长时间.我更喜欢锁定一个永远不会暴露在课堂外的参考 - 就像syncLock.

最后,由于CLI内存模型,无论如何都会破坏此实现.(它可能会也可能不会在MS实现中被破坏,这有点强.我不想打赌任何一种方式.)_instance变量应该被标记为volatile好像你真的想要使用这种方法......但是我d个人避免双重检查锁定.有关详细信息,请参阅我关于单例模式的文章.

  • 你需要锁定一个对象.这就是它的全部. (2认同)