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

  • 相关阅读:
    Hadoop2.2.0 注意事项
    为一个表增加一列,这个列能够自增加1
    商品推荐系统问题
    Android Service服务-(转)
    android实现通知栏消息
    【Android】状态栏通知Notification、NotificationManager详解(转)
    android调用邮件应用发送email
    有关WebView开发问题(转)
    Android开发把项目打包成apk-(转)
    对话框(单选)
  • 原文地址:https://www.cnblogs.com/WilsonPan/p/12815640.html
Copyright © 2011-2022 走看看