zoukankan      html  css  js  c++  java
  • 单例模式 与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是否为空的判断,则第一个线程创建了实例,而第二个线程还是可以继续再创建新的实例,这就没有达到单例的目的了。
  • 相关阅读:
    Java内部类
    sql几种连接的区别
    常见的十大算法
    使用yml文件配置数据库数据时的问题
    SpringBoot整合Mybatis
    不是书评 :《我是一只IT小小鸟》
    考试考完了·
    MSSQL站库分离情况的渗透思路
    VENOM cve-2015-3456 Qemu 虚拟机逃逸漏洞POC
    Python 实现指定目录下 删除指定大小的文件
  • 原文地址:https://www.cnblogs.com/D-LuFei/p/4617980.html
Copyright © 2011-2022 走看看