单例模式 与lock用法

  在之前没用lock之前;如果我实现单例模式;直接就是下面的代码:

   public class Singleton
    {
        private static Singleton instance = null;
        private Singleton()
        {  //构造方法是private,堵死了外界用new实例化
            //dosomething
        }
        //获取本类实例的唯一全局访问点
        public static Singleton getInstance()
        {
            if (instance == null)
            {        //若实例不存在,创建一个返回,否则返回已有实例
                instance = new Singleton();
            }
            return instance;
        }
    }

起初也没碰到问题,之后我看到lock的用法的时候;觉得这个用法不错;也加到了现有的项目中;

项目实例:

 #region 数据库层单例模式

        private static IDB _EFDB = null;
        // Creates an syn object.
        private static readonly object SynObject = new object();

        public static IDB InstanceEFDB
        {
            get
            {
                // Double-Checked Locking
                if (null == _EFDB)
                {
                    lock (SynObject)
                    {
                        if (null == _EFDB)
                        {
                            _EFDB = new EFDB();
                        }
                    }
                }

                return _EFDB;
            }
        }

        #endregion //数据库层单例模式

解析:在外层已经判断了_EFDB== null为什么在lock()后面还需要判断一次_EFDB== null呢? 
    因为,加入有两个线程同时调用了InstanceEFDB()方法,它们将都可以通过第一重_EFDB== null的 判断,然后由于lock机智,这两个线程则一个进入,另一个在排队等待,必须要其中的一个进入并出来后,另外一个才能进入,因此如果没有了第二重 _EFDB是否为空的判断,则第一个线程创建了实例,而第二个线程还是可以继续再创建新的实例,这就没有达到单例的目的了。
原文地址:https://www.cnblogs.com/D-LuFei/p/4617980.html