单例模式的三种写法和优缺点

时间:2022-03-08 19:11:02
 1 using System;  2 using System.Collections.Generic;  3 
 4 namespace ConsoleApp1  5 {  6     class Singleton  7  {  8         private static Singleton _singleton = null;  9         private static object singleton_Lock = new object();  //对象锁
10 
11         /// <summary>
12         /// 标准的单例模式 13         /// </summary>
14         /// <returns></returns>
15         public static Singleton CreateInstance() 16  { 17             if (_singleton == null)//保证对象初始化之后的所有线程,不需要等待锁
18  { 19                 lock (singleton_Lock)//保证只有一个线程进去判断
20  { 21                     if (_singleton == null)//保证对象为空才创建
22  { 23                         _singleton = new Singleton(); 24  } 25  } 26  } 27             return _singleton; 28  } 29  }//Class_end 30 }

第一种单例的写法,是用两个if加一个Lock来优化在多线程情况下调用单例的耗时,而下面是第二种写法(下图),效果一样,但更加简单

 1 using System;  2 using System.Collections.Generic;  3 
 4 namespace ConsoleApp1  5 {  6     class Singleton  7  {  8         private static Singleton _Singleton = null;  9 
10         /// <summary>
11         /// 静态构造函数:由CLR保证,在第一次调用之前调用,只调用一次 12         /// </summary>
13         static Singleton() 14  { 15             _Singleton = new Singleton(); 16  } 17 
18         public static Singleton CreateInstance() 19  { 20             return _Singleton; 21  } 22       }//Class_end
23 }
第三种单例的写法更简单,直接在声明静态变量的时候创建实例化类
 1 using System;  2 using System.Collections.Generic;  3 
 4 namespace ConsoleApp1  5 {  6     class Singleton  7  {  8         //静态变量会在类型第一次使用的时候初始化,而且只初始化一次
 9         private static Singleton _singleton = new Singleton(); 10         public static Singleton CreateInstance() 11  { 12             return _singleton; 13  } 14       }//class_end
15 }
这三种单例的写法,其实效果都一样,只是后面两种是由系统CLR帮我们调用创建实例类。
单例的优点是:保证整个进程中该对象只被实例化一次,减少性能消耗
缺点是:常驻内存,不会被GC回收(普通类型需要的时候就初始化,用完被GC自动回收),而且过多使用单例,而单例类本身带有公有变量,就会很容易造成严重的问题