我偶然看到this的一篇文章,讨论为什么双重检查锁定范例在Java语言中被打破了。如果变量被声明为volatile
,那么该范例对于.NET (特别是C#)是否有效
发布于 2010-05-26 07:46:38
.NET 4.0有一个新的类型:Lazy<T>
,它消除了人们对错误模式的担忧。它是新的任务并行库的一部分。
请参阅MSDN并行计算开发人员中心:http://msdn.microsoft.com/en-us/concurrency/default.aspx
顺便说一句,.NET 3.5 SP1 available here有一个后端口(我相信它不受支持)。
发布于 2008-12-27 11:32:27
注意,在Java语言中(很可能在.Net中也是如此),对单例初始化的双重检查锁定是完全不必要的,也是不必要的。因为类只有在第一次使用时才会被初始化,所以所需的惰性初始化已经通过这个方法实现了;
private static Singleton instance = new Singleton();
除非您的Singleton类包含可能在首次使用Singleton实例之前访问的常量之类的内容,否则这就是您需要做的全部工作。
发布于 2015-04-14 04:05:59
我不明白为什么所有人都说双重检查锁定是不好的模式,但却不调整代码以使其正确工作。在我看来,下面的代码应该可以很好地工作。
如果有人能告诉我这段代码是否存在卡梅隆文章中提到的问题,请告诉我。
public sealed class Singleton {
static Singleton instance = null;
static readonly object padlock = new object();
Singleton() {
}
public static Singleton Instance {
get {
if (instance != null) {
return instance;
}
lock (padlock) {
if (instance != null) {
return instance;
}
tempInstance = new Singleton();
// initialize the object with data
instance = tempInstance;
}
return instance;
}
}
}
https://stackoverflow.com/questions/394898
复制相似问题