C# 是否可以实现不带锁但使用volatile的单例设计模式?
我们可以使用volatile关键字吗,因为据我所知,它提供了实例新鲜度C# 是否可以实现不带锁但使用volatile的单例设计模式?,c#,singleton,volatile,C#,Singleton,Volatile,我们可以使用volatile关键字吗,因为据我所知,它提供了实例新鲜度 public sealed class Singleton { private static volatile Singleton instance = null; private static readonly object padlock = new object(); Singleton() { } public static Singleton Instance
public sealed class Singleton
{
private static volatile Singleton instance = null;
private static readonly object padlock = new object();
Singleton()
{
}
public static Singleton Instance
{
get
{
if (instance == null)
{
instance = new Singleton();
}
return instance;
}
}
}
“提供实例新鲜度”是什么意思?不,您仍然可以创建两个
单例的实例。线程一看到instance==null
就要进入if
的主体,但随后它被抢占,线程二也看到instance==null
,也进入if
的主体,创建一个新的单例。然后线程1继续,并创建单线程。更糟糕的是,线程2可能已经返回,而其他一些代码现在有一个对Singleton
的引用,该引用随后被另一个引用替换。volatile表示Singleton的完全相反。Singleton表示“永不改变”,volatile表示可以随时改变。