Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.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中的锁变量#_C#_Multithreading_Design Patterns - Fatal编程技术网

C# C中的锁变量#

C# C中的锁变量#,c#,multithreading,design-patterns,C#,Multithreading,Design Patterns,我知道什么时候在C#中使用lock块,但我不清楚的是lock语句括号中的lock变量。从考虑单点设计模式 > 类负载平衡器 { 私有静态负载均衡器_实例; 私有列表_服务器=新列表(); 私有静态对象syncLock=新对象(); 公共静态负载平衡器GetLoadBalancer() { //通过以下方式支持多线程应用程序 //“双重检查锁定”模式(一次 //实例存在)避免锁定每个实例 //调用该方法的时间 if(_instance==null) { 锁定(同步锁定) { if(_instanc

我知道什么时候在C#中使用lock块,但我不清楚的是lock语句括号中的
lock变量
。从

考虑<代码>单点设计模式<代码> >
类负载平衡器
{
私有静态负载均衡器_实例;
私有列表_服务器=新列表();
私有静态对象syncLock=新对象();
公共静态负载平衡器GetLoadBalancer()
{
//通过以下方式支持多线程应用程序
//“双重检查锁定”模式(一次
//实例存在)避免锁定每个实例
//调用该方法的时间
if(_instance==null)
{
锁定(同步锁定)
{
if(_instance==null)
{
_实例=新的LoadBalancer();
}
}
}
返回_实例;
}
}
在上面的代码中,我无法理解为什么我们不使用锁变量的
\u instance
,而不是'syncLock'

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

首先,你会试图锁定一个空引用

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

另外,您将锁定一个也返回给呼叫者的引用,呼叫者可以任意长时间持有该锁。我更喜欢锁定一个从未暴露在类之外的引用,比如
syncLock

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

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

首先,你会试图锁定一个空引用

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

另外,您将锁定一个也返回给呼叫者的引用,呼叫者可以任意长时间持有该锁。我更喜欢锁定一个从未暴露在类之外的引用,比如
syncLock


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

我自己很少使用lock语句

但我的猜测是,这是因为您无法锁定实例,因为它为null


因此,您必须创建静态对象“synclock”,它仅用于锁定您实际创建“instance”变量的部分。

我自己很少使用lock语句

但我的猜测是,这是因为您无法锁定实例,因为它为null


因此,您必须将静态对象设置为“synclock”,它仅用于锁定您实际创建“instance”变量的部分。

这是我的一个常规样式首选项-只要可能,仅锁定为锁定目的专门创建的对象


这是我的一个通用样式首选项-只要可能,只锁定为锁定目的专门创建的对象


为什么编译器使用同步锁?这个变量有什么好处?@SeyedMortezaMousavi:你说的“为什么编译器使用同步锁”是什么意思?不是编译器,而是开发人员。。。关键是要确保只有一个线程进入创建LoadBalancer实例的代码。您需要锁定一个对象。这就是它的全部功能。@CoryNelson所以syncLock将用于检查“锁块中是否有线程”@SeyedMortezaMousavi:你为什么希望它这样做?您将如何指出您想要的粒度?(这已经偏离了最初的主题,它建议您或许应该回去阅读MSDN上的锁或一本很好的入门C#书。)为什么编译器使用syncLock?这个变量有什么好处?@SeyedMortezaMousavi:你说的“为什么编译器使用同步锁”是什么意思?不是编译器,而是开发人员。。。关键是要确保只有一个线程进入创建LoadBalancer实例的代码。您需要锁定一个对象。这就是它的全部功能。@CoryNelson所以syncLock将用于检查“锁块中是否有线程”@SeyedMortezaMousavi:你为什么希望它这样做?您将如何指出您想要的粒度?(这与最初的主题大相径庭,它建议您应该回去阅读MSDN上的锁或一本很好的入门C#书。)
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;
 }
}