.NET中的双重检查锁定如何实现?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (20)

我遇到了这篇文章,讨论为什么在Java中打破了双重检查锁定范例。如果声明变量,该范例是否适用于.NET(特别是C#)volatile

提问于
用户回答回答于

在C#中实现Singleton模式在第三个版本中讨论了这个问题。

它说:

使实例变量volatile变量可以使其工作,就像明确的内存屏障调用一样,尽管在后一种情况下,即使专家也不能确切地同意需要哪些屏障。我倾向于尝试避免专家不同意正确和错误的情况!

作者似乎暗示双重锁定比其他策略更不可能工作,因此不应该使用。

用户回答回答于

双重检查锁定现在可以在Java和C#中工作(Java内存模型已更改,这是其中一种效果)。但是,你必须完全正确。如果你把事情搞得一团糟,你最终可能会失去线程安全。

正如其他答案所述,如果你正在实现单例模式,那么有更好的方法来实现它。就个人而言,如果我处于必须在双重锁定锁定和“每次锁定”代码之间进行选择的情况,那么我会每次都锁定,直到我有确实证据表明它正在造成瓶颈。当涉及到线程时,一个简单明显正确的模式是值得的。

扫码关注云+社区