我偶然看到this的一篇文章,讨论为什么双重检查锁定范例在Java语言中被打破了。如果变量被声明为volatile,那么该范例对于.NET (特别是C#)是否有效
发布于 2008-12-27 11:21:13
Implementing the Singleton Pattern in C#在第三版中谈到了这个问题。
上面写着:
使实例变量易失性可以让它工作,显式内存屏障调用也可以,尽管在后一种情况下,即使是专家也不能确切地同意需要哪些屏障。我倾向于避免专家不同意什么是对什么是错的情况!
作者似乎暗示,与其他策略相比,双重锁定不太可能奏效,因此不应使用。
发布于 2008-12-27 11:47:36
双重检查锁定现在可以在Java和C#中工作( Java内存模型改变了,这是其中一个效果)。然而,你必须让它完全正确。如果你把事情搞得一团糟,你很可能最终失去线程的安全性。
正如其他答案所述,如果您正在实现singleton pattern,那么有更好的方法来实现它。就我个人而言,如果我处于一种情况下,我必须在自己实现双重检查锁定和“每次锁定”代码之间做出选择,我会选择每次都锁定,直到我得到真正的证据表明它造成了瓶颈。当谈到线程时,一个简单且明显正确的模式是非常有价值的。
发布于 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有一个后端口(我相信它不受支持)。
https://stackoverflow.com/questions/394898
复制相似问题