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

  • 相关阅读:
    uva11916 Emoogle Grid (BSGS)
    2016vijos 1-2 股神小L(堆)
    bzoj千题计划311:bzoj5017: [Snoi2017]炸弹(线段树优化tarjan构图)
    Oracle Profile 使用详解--zhuanzai
    通过srvctl add命令添加database信息到srvctl管理器-转
    Oracle Dataguard Standby Redo Log的两个实验
    MySQL数据的主从复制、半同步复制和主主复制详解-转
    解决oralce 11g dg搭建报错:ORA-16664、ORA-16714、ORA-16810问题--转
    oracle分布式事务总结-转载
    日志挖掘Logmnr
  • 原文地址:https://www.cnblogs.com/shanoon/p/5450154.html
Copyright © 2011-2022 走看看