设计模式之单例模式

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

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

 

posted @ 2016-06-13 16:45  luyujie_may  阅读(250)  评论(0编辑  收藏  举报