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操作,第二个线程还可以创建实例。

  • 相关阅读:
    Day 38
    Day 37
    Day 36
    Day 35
    Day 34
    Day 33
    Day 32
    Day 31
    Day 30
    华为CE6180高级ACL配置
  • 原文地址:https://www.cnblogs.com/luyujie/p/5581187.html
Copyright © 2011-2022 走看看