zoukankan      html  css  js  c++  java
  • 【设计模式】单例模式

    定义

    确保某个类只有一个实例

    实现方式

    饿汉式加载(线程安全)

    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();
    }
    
    • 线程安全
    1. 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;
            }
        }
    }
    
    1. 借助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;
    }
    

    示例代码 - github

  • 相关阅读:
    使用fiddler进行app弱网测试
    弱网测试
    Java虚拟机的内存模型
    Junit使用
    python安装numpy和scipy的资源
    HTTP资源合集
    http之post方法 提交数据的四种方法
    计算机编码中的换行 CR与LF
    python Mixin 是个啥?
    python mock的简单使用
  • 原文地址:https://www.cnblogs.com/WilsonPan/p/12815640.html
Copyright © 2011-2022 走看看