public class Singleton { private static Singleton singleton; private static readonly object obj = new object(); private Singleton() { } public static Singleton GetInstance() { if (singleton == null) { lock (obj) { if (singleton == null) singleton = new Singleton(); } } return singleton; } }
单例模式顾名思义只允许有一个实例。
构造函数一定要是私有的.保证外部不能通过new来生成新的实例。
并且暴露出来一个CreateInstance入口去给外部调用创建实例,该方法一定要是public的,并且static。
双重校验锁的目的:线程安全
第一重校验:效率问题,如果不要这重校验,每个进程进来都会被阻塞,影响效率。
加锁:阻塞
第二重校验:保证只能创建一个实例。
class Program { static void Main(string[] args) { Singleton singleton = Singleton.GetInstance(); Singleton singleton2 = Singleton.GetInstance(); Console.WriteLine(singleton == singleton2); // true Console.WriteLine(singleton.Equals(singleton2)); //true Console.ReadLine(); } }