多篇文章说在实施双重检查锁定模式时。NET 您锁定的字段应该应用了易失性修饰符。但到底为什么?考虑到以下例子:
public sealed class Singleton
{
private static volatile Singleton instance;
private static object syncRoot = new Object();
private Singleton() {}
public static Singleton Instance
{
get
{
if (instance == null)
{
lock (syncRoot)
{
if (instance == null)
instance = new Singleton();
}
}
return instance;
}
}
}
为什么“ lock (syncRoot)”不能实现必要的内存一致性?在“ lock”语句之后,读和写都会变得不稳定,因此必要的一致性就会实现,这是真的吗?