【设计模式】单例模式
定义
确保某个类只有一个实例
实现方式
饿汉式加载(线程安全)
public sealed class Singleton { private static Singleton _instance = new Singleton(); //将构造函数设置私有,外部不能new private Singleton() { } public static Singleton Instance => _instance; }
等价于
public sealed class Singleton { private static Singleton _instance; static Singleton() { _instance = new Singleton(); } //将构造函数设置私有,外部不能new private Singleton() { } public static Singleton Instance => _instance; }
懒汉式加载
- 非线程安全
public sealed class Singleton { private static Singleton _instance; private Singleton() { } public static Singleton Instance => _instance = _instance ?? new Singleton(); }
- 线程安全
- Double Check
public sealed class Singleton { private static readonly object _lock = new object(); private static Singleton _instance; private Singleton() { Console.WriteLine("Singleton Constructor"); } public static Singleton Instance { get { /// 避免走内核代码 if (_instance != null) return _instance; lock (_lock) { if (_instance == null) { var temp = new Singleton(); //确保_instance写入之前,Singleton已经初始化完成 System.Threading.Volatile.Write<Singleton>(ref _instance, temp); } } return _instance; } } }
- 借助Lazy
public sealed class Singleton { private static Lazy<Singleton> _instance = new Lazy<Singleton>(() => new Singleton(), true); private Singleton() { Console.WriteLine("Singleton Constructor"); } public static Singleton Instance => _instance.Value; }
相关推荐
xiaoemo0 2020-04-08
ahnuzfm 2020-02-03
Ingram 2020-01-16
fraternityjava 2020-06-14
ahnuzfm 2020-05-07
付春杰Blog 2020-03-26
Kele0 2020-05-30
elizabethxxy 2020-04-27
JF0 2020-03-20
缘起宇轩阁 2019-12-30
gongruitao 2020-01-04
zuixin 2020-01-03
pengkunstone 2019-12-27
waitui00 2019-12-22