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

    定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点。

    好处:1.保证唯一的实例 2.可以严格控制客户怎样访问它以及何时访问,即对唯一实例的受控访问

    第一版:

      class Singleton
        {
            private static Singleton instance;
            private Singleton() { } //构造方法让其private,堵死外界利用new创建此类实例的可能
            public static Singleton GetInstance()
            {
                if (instance == null) {
                    instance = new Singleton();
                }
                return instance;
            }
        }

    第二版:多线程时

       class Singleton
        {
            private static Singleton instance;
            private static readonly object lockobj = new object();//因instance是否被创建不能确定,所以不能作为锁对象,需要重新声明一个静态只读对象
            private Singleton() { } //构造方法让其private,堵死外界利用new创建此类实例的可能
            public static Singleton GetInstance()
            {
                //同一时刻加了锁的那部分程序只有一个线程可以进入
                lock (lockobj)
                {
                    if (instance == null)
                    {
                        instance = new Singleton();
                    }
                }
                return instance;
            }
        }

    第三版:双重锁定(因每次调用getinstance()方法都需要lock,会影响性能)

     public sealed class Singleton //阻止派生类
        {
            private static Singleton instance;
            private static readonly object lockobj = new object();//因instance是否被创建不能确定,所以不能作为锁对象,需要重新声明一个静态只读对象
            private Singleton() { } //构造方法让其private,堵死外界利用new创建此类实例的可能
            public static Singleton GetInstance()
            {
                if (instance == null)//先判断实例是否存在,不存在再进行加锁处理
                {
                    //同一时刻加了锁的那部分程序只有一个线程可以进入
                    lock (lockobj)
                    {
                        if (instance == null)
                        {
                            instance = new Singleton();
                        }
                    }
                }
                return instance;
            }
        }

    第二个为null判断的原因:当instance=null并且同时有两个线程调用getinstance()方法时,他们可以通过第一重=null判断,然后由于lock机制只有一个进入,另一个在外排队等候。第一个完成之后,如果没有第二重=null操作,第二个线程还可以创建实例。

  • 相关阅读:
    NETCore EF 数据库连接正确nuget和MySql错误异常
    JS 对象属性名排序
    NET 在一个数组中查找另一个数组所在起始位置(下标从0开始,未找到返回-1)
    NET 判断是否为回文
    NET/Regex 处理连续空格
    NET 已知excel表格前面26个是a到z,27是aa28是ab,以此类推,N是多少
    Regex 首字母转大写/小写,全大写,全小写
    .NETCore下访问img、js等静态资源404解决办法
    WPF-后台代码使用Behavior
    Socket-服务器端与客户端互相通信
  • 原文地址:https://www.cnblogs.com/luyujie/p/5581187.html
Copyright © 2011-2022 走看看