单例模式属于创建型设计模式
1.某个进程中,一个类只有一个实例,单例使类的实例复用,减少资源浪费,更快获取资源
单例的条件:(1)构造函数私有化
(2)公开的静态方法提供对象的实例
2.懒汉式
1 /// <summary> 2 /// 3 全局唯一静态 重用这个变量 3 /// </summary> 4 private static volatile Singleton _Singleton = null;//volatile 促进线程安全 让线程按顺序操作 5 private static object Singleton_Lock = new object(); 6 7 /// <summary> 8 /// 2 公开的静态方法提供对象实例 9 /// </summary> 10 /// <returns></returns> 11 public static Singleton CreateInstance() 12 { 13 if (_Singleton == null)//假如现在 5个线程过来初始化 第1个线程进去把_Singleton实例化;5分钟之后,又有100个线程同时来创建, 排队--判断不为空--然后返回 其实不该排队了,应该直接判断 14 { 15 lock (Singleton_Lock)//保证只有一个线程进去判断+初始化 16 { 17 if (_Singleton == null)//这个也不能去掉,第一次5个线程进来的时候 如果没有这个判断,还是重复创建的 18 { 19 _Singleton = new Singleton(); 20 } 21 } 22 } 23 return _Singleton; 24 }//懒汉式 调用了方法才去构造
3.饿汉式,静态构造函数:由CLR保证,程序第一次使用这个类型前被调用,且只调用一次
并且静态构造函数是线程安全的
1 static SingletonSecond() 2 { 3 _SingletonSecond = new SingletonSecond(); 4 Console.WriteLine("SingletonSecond 被启动"); 5 } 6 7 8 private static SingletonSecond _SingletonSecond = null; 9 public static SingletonSecond CreateInstance() 10 { 11 return _SingletonSecond; 12 }//饿汉式 只要使用类就会被构造
3.饿汉式,静态字段
1 /// <summary> 2 /// 静态字段:在第一次使用这个类之前,由CLR保证,初始化且只初始化一次 3 /// 这个比静态构造函数还早 4 /// </summary> 5 private static SingletonThird _SingletonThird = new SingletonThird();//打印个日志 6 public static SingletonThird CreateInstance() 7 { 8 return _SingletonThird; 9 }//饿汉式 只要使用类就会被构造