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

    一、单例模式

    目的:创建唯一实例

    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的判断,则第一个线程创建了实例,而第二个线程还是可以继续再创建新的实例,这就没有达到单例的目的。

  • 相关阅读:
    .net导出Excel几种方式比较
    各种loading加载中gif图标
    鼠标右键Table的td弹出多级菜单,双击td编辑
    解决远程连接超过最大数
    JQuery1.72中二个Bug,formhtml()方法与clone()方法的二个Bug进行重写
    Wijmo 2017路线图
    Wijmo 2016 V3发布
    ComponentOne 2016 V3 发布
    Angular2正式版发布,Wijmo抢先支持
    最好的Angular2表格控件
  • 原文地址:https://www.cnblogs.com/shanoon/p/5450154.html
Copyright © 2011-2022 走看看