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

  • 相关阅读:
    产品开发协作流程
    iOS性能优化
    iOS地图国内和国外的偏差
    Apple技术支持
    iOS应用架构谈 网络层设计方案
    form表单重复被提交
    SpringBoot+filter+listener+拦截器
    SpringBoot中的异常处理
    谷歌浏览器突然不能使用,并且出现报错码"STATUS_INVALID_IMAGE_HASH"解决方法
    form提交(图片,excel其他文件)
  • 原文地址:https://www.cnblogs.com/WilsonPan/p/12815640.html
Copyright © 2011-2022 走看看