Skip to main content
 首页 » 编程设计

c#之C#中的锁变量

2024年01月13日28jirigala

我知道在 C# 中什么时候使用 lock block ,但我不清楚的是 lock 语句括号中的 lock variable 。考虑遵循 DoFactory 中的单例设计模式 :

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; 
 } 
} 

在上面的代码中,我不明白为什么我们不使用_instance作为锁变量而不是`syncLock?

请您参考如下方法:

in the above code, i can not understand why we do not use _instance for lock variable instead of `syncLock?

一方面,你会尝试锁定空引用...

此外,您将通过可变字段进行锁定,这是一个坏主意。 (如果该字段更改值,那么另一个线程可以进入相同的代码。不太好。)通过只读字段锁定通常是个好主意。

此外,您将锁定一个引用,该引用也返回给可以任意长时间持有锁的调用者。我更喜欢锁定一个永远不会暴露在类之外的引用——比如 syncLock。

最后,由于 CLI 内存模型,这个实现无论如何都会被破坏。 (它可能在 MS 实现中被破坏,它更强大一些。我不想打赌。) _instance 变量应该被标记as volatile 如果你真的想使用这种方法......但我个人还是会避免双重检查锁定。看我的article on the singleton pattern了解更多详情。