Sey*_*avi 1 c# multithreading design-patterns
我知道何时在C#中使用锁定块,但我不清楚的是lock variable在lock语句的括号中.请考虑Singleton Design Pattern从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;
}
}
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,我无法理解为什么我们不使用_instancelock变量而不是`syncLock?
Jon*_*eet 12
在上面的代码中,我无法理解为什么我们不使用_instance来锁定变量而不是`syncLock?
好吧,你会试图锁定一个空引用,一方面......
此外,你将通过可变字段锁定,这是一个坏主意.(如果字段改变了值,那么另一个线程可以进入相同的代码.不是很好.)通过readonly字段锁定通常是一个好主意.
此外,您将锁定一个引用,该引用也会返回给调用者,这些调用者可以持续锁定任意长时间.我更喜欢锁定一个永远不会暴露在课堂外的参考 - 就像syncLock.
最后,由于CLI内存模型,无论如何都会破坏此实现.(它可能会也可能不会在MS实现中被破坏,这有点强.我不想打赌任何一种方式.)_instance变量应该被标记为volatile好像你真的想要使用这种方法......但是我d个人避免双重检查锁定.有关详细信息,请参阅我关于单例模式的文章.