单例模式

一、单例模式

目的:创建唯一实例

class Singleton
{
    private static Singleton instance;  //私有静态类变量
    
    //主动创建私有的构造方法,这样就堵死了外界利用new创建此类实例的可能      
     private Singleton()       
    {
    }

   //此方法是获得本类实例的唯一全局访问点 
    pulic static Singleton GetInstance()
    {
        if(instance==null)
        {
            instance=new Singleton();
        }
        return instance;   
    }
}

 二、多线程时的单例

 lock确保当一个县城位于代码的临界区时,另一个线程不进入临界区。如果其他线程试图进入锁定的代码,则他将一直等待,直到对象被释放。

class Singleton
{
    private static Singleton instance;  
    private static readonly Object syncRoot=new Object();   //程序运行时创建一个静态只读的进程辅助对象

     private Singleton()       
    {
    }

    pulic static Singleton GetInstance()
    {
        lock(syncRoot)  //在同一时刻加了锁的那部分代码只有一个线程可以进入
        {
            if(instance==null)
            {
                instance=new Singleton();
            }
        }
        return instance;   
    }
}

 三、双重锁定

class Singleton
{
    private static Singleton instance;  
    private static readonly Object syncRoot=new Object();   

     private Singleton()       
    {
    }

    pulic static Singleton GetInstance()
    {
        if(instance==null)  //先判断实例是否存在,不存在再加锁处理
        {
            lock(syncRoot)  
            {
                if(instance==null)
                {
                    instance=new Singleton();
                }
            }
        }
        return instance;   
    }
        

  对于instance存在的情况,就直接返回。当instance为null并且同时又两个线程调用GetInstance()方法时,他们将都可以通过第一重instance==null的判断。然后由于lock机制,这连个线程则只有一个进入,另一个在外排队等候,必须要其中的一个进入并出来后,另一个才能进入。而此时如果没有了第二重的instance是否为null的判断,则第一个线程创建了实例,而第二个线程还是可以继续再创建新的实例,这就没有达到单例的目的。

posted @ 2016-05-01 11:50  Leo的日记本  阅读(166)  评论(0编辑  收藏  举报