• 单例模式 与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是否为空的判断,则第一个线程创建了实例,而第二个线程还是可以继续再创建新的实例,这就没有达到单例的目的了。
  • 相关阅读:
    旅行计划
    两只塔姆沃斯牛
    迷宫
    异或序列
    异或之和
    素数个数
    SAC E#1
    [JSOI2010]Group 部落划分 Group
    [USACO12FEB]附近的牛Nearby Cows
    [HNOI2008]Cards
  • 原文地址:https://www.cnblogs.com/D-LuFei/p/4617980.html
Copyright © 2020-2023  润新知