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

  • 相关阅读:
    Git-本地项目和远程项目关联
    P1-Linux下安装MySQL及登录用户配置
    P2-Centos中安装vsftpd
    ElasticSearch安装及HEAD插件配置
    ArrayList源码分析
    Maven的继承以及import作用域
    单例模式浅析
    Vim快捷键记录(工作中遇到)
    OSX下 pip更新及安装python库
    统计工具之QQ图
  • 原文地址:https://www.cnblogs.com/WilsonPan/p/12815640.html
Copyright © 2011-2022 走看看