设计模式C#合集--单例模式

单例模式

代码:

  第一种:

private static Singleton singleton = null;

private Singleton() { }

public static Singleton GetInstance
{
    get
    {
         if (singleton == null)
        {
            singleton = new Singleton();
        }
        return singleton;
    }
}

  第二种:

public class Singleton
{
    private static readonly Singleton singleton = new Singleton();

    private Singleton() { }

    public static Singleton GetInstance
    {
        get
        {
            return singleton;
        }
    }
}

  上面两种单例模式中,基本思路相同,将构造方法私有,建立私有的实例对象,提供公有的对象。第一种方法,外部每次调用时都会判断实例是否已经创建,第二种方法则是在一开始就将类的对象实例化好了,一直存在在内存中。区别也不大,单例的思想也就这么简单。这里要说的是下面这种方法。

public class Singleton
    {
        private static Singleton singleton = null;

        private static object flagobj = new object();

        private Singleton() { }

        public static Singleton GetInstance
        {
            get
            {
                if (singleton == null)
                {
                    lock (flagobj)
                    {
                        if (singleton == null)
                        {
                            singleton = new Singleton();
                        }
                    }
                }
                return singleton;
            }
        }
    }

  这种实现方式和上面最多了一个object对象,然后看看GetInstance里有什么变化,思路很简单,多出来的object对象就是一个锁,其他地方访问的时候首先判断这个类是否有实例,没有实例就把"锁"给锁上,为什么要锁上呢?锁是为了怕"别人"使用,也就是应对多线程的情况了。然后我们再来看看为什么判断了两次当前实例引用是否为空呢?假设有两个线程a、b同时来到GetInstance,此时的singleton为null,那么都进去了,a把flagobj锁上,b就在外面等了,然后a再判断singleton是不是空引用,创建了一个实例,a走了之后b进来发现已经不是null了,就不再创建了,所以lock内的if是一定要存在的,那这时来看看为什么外面还要一个if呢?直接里面判断不是就好了嘛?这就是lock本身的问题了,要知道lock本身是一个相对耗时的操作,所以在外面加一个if,来规避过多的lock操作。三种方法,实习到目前为止,之前做的都是web的,那些很少用到多线程 ,唯一一次还是为了展示一下自己是会的才用的(然后我老大看到的时候并没有夸我。。),所以我大部分情况都还是用以上两种单例模式。

posted on 2017-01-05 16:16  TIEDPAG  阅读(212)  评论(0编辑  收藏  举报

导航