23种设计模式学习一(单列模式)singleton

时间:2021-03-22 13:35:07
单列模式的类(单线程下的)
class Singleton
{
private static Singleton instance;
private Singleton() { }
public static Singleton Instance
{
get
{
if (instance == null)
{
instance = new Singleton();
}
return instance;
}
}
}

通过以下代码,进行测试,是不是同一个实例

  Singleton demo = Singleton.Instance;
Singleton demo2 = Singleton.Instance;
Console.Write(object.ReferenceEquals(demo,demo2));
Console.Read();

输出:true,显然是同一个实例

以上是在单线程的情况下使用,如果是多线程,则可能会有两个同时去创建,产生多个实例,所以,多线程应该用以下方式创建,用了doublecheck和volatile

 //多线程下
class SingletonMulit
{
/**volatile 作用:保证严格意义上的多线程上只有单实例
个变量经 volatile修饰后在所有线程中必须是同步的;
* 任何线程中改变了它的值,所有其他线程立即获取到了相同的值。理所当然的,volatile修饰的变量 存取时比一般变量消耗的资源要多一点,因为线程有它自己的变量拷贝更为高效。
*/
private static volatile SingletonMulit instance=null;
private static object lockHelper = new object(); private SingletonMulit() { }
public static SingletonMulit Instance
{
get
{
if (instance == null)
{
lock (lockHelper)
{
if (instance == null)
{
instance = new SingletonMulit();
}
}
}
return instance;
}
}
}