版权声明:本文为博主原创文章,未经博主允许不得转载。 https://cloud.tencent.com/developer/article/1336872
学习单例模式时,好多人都不太理解双重锁定。学完后突然想到一个很有趣的例子。
单例模式结构图:
代码:
Singleton类
class Singleton
{
private static Singleton instance;
private static readonly object syncRoot = new object(); //程序运行时创建一个静态只读的进程辅助对象
private Singleton() { } //用private修饰构造方法,防止外界利用new创建此类实例
public static Singleton GetInstance()
{
if (instance == null) //若instance对象为null,则继续
{
lock (syncRoot) //↓↓↓↓在同一时刻加了锁的这部分程序只有一个线程可以进入↓↓↓↓
{
if (instance == null)//如果instance对象为null,则为它分配实例
{
instance = new Singleton();
}
} //↑↑↑↑在同一时刻加了锁的这部分程序只有一个线程可以进入↑↑↑↑
}
return instance;
}
}
客户端代码
static void Main(string[] args)
{
Singleton singleton1=Singleton.GetInstance();
Singleton singleton2=Singleton.GetInstance();
//……
}
说明:
《大话设计模式》中,小菜问道:“我在外面已经判断了instance实例是否存在,为什么在lock里面还要做一次instance实例是否存在的判断呢?”
大鸟是这么回答的:当instance为null并且同时有两个线程调用GetInstance方法时,他们将都可以通过第一重instance==null的判断。然后由于lock机制,这两个线程则只有一个进入,另外一个在外排队等候,必须要其中的一个进入并出来后,另一个才能进入,而此时如果没有了第二重的instance是否为null的判断,则第一个线程创建了实例,第二个线程还是可以继续再创建新的实例,这就没有达到单例的目的。