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

      单例模式功能:

    1. 确保一个类只有一个实例被建立 
    2. 提供了一个对对象的全局访问指针 
    3. 在不影响单例类的客户端的情况下允许将来有多个实例

    一:懒汉式(特点:延迟加载,用的时候才创建对象)

    class CSingleton  { 

    public: 

    static CSingleton* GetInstance()  {    

       if ( m_pInstance == NULL ) {        

          m_pInstance = new CSingleton();

    }     

      return m_pInstance; 

                    } 

    }

    private:    

      CSingleton(){};  

      static CSingleton * m_pInstance;

      };

      注:在懒汉式的单例类中,其实有两个状态,单例未初始化和单例已经初始化。假设单例还未初始化,有两个线程同时调用GetInstance方法,这时执行 m_pInstance == NULL 肯定为真,然后两个线程都初始化一个单例,最后得到的指针并不是指向同一个地方,不满足单例类的定义了,所以懒汉式的写法会出现线程安全的问题!在多线程环境下,要对其进行修改

      多线程情况下懒汉单例模式的代码:

      class Singleton  {

    private:    

      static Singleton* m_instance;     

    Singleton(){} 

    public:     

    static Singleton* getInstance();  }; 

       Singleton* Singleton::getInstance()  {     

    if(NULL == m_instance)      {       

       Lock();//借用其它类来实现,如boost      

        if(NULL == m_instance)          {         

         m_instance = new Singleton;      

        }       

       UnLock();     

    }     

    return m_instance; 

    }

          

    二:饿汉式

    class CSingleton    {   

    private:        CSingleton() {  

                } 

       public:  

          static CSingleton * GetInstance() 

           {            

             return &instance;       

       }   

     private:

    static CSingleton instance;  

    };

    总结:

    懒汉和饿汉的区别:
      就是看定义的是静态成员对象变量还是静态成员对象指针变量;
    因为如果定义了静态成员对象变量,程序在运行之初已经分配了空间,就要调用构造函数了,而你在调用getinstance的时候,不会再调用构造函数了,因为之前已经调用过了,你就是用的现成的,就是所谓的饿汉模式;
    而定义了静态成员对象指针变量,程序运行之初也会分配空间,但是那个是指针的空间,而不是对象的空间,所以不会调用对象的构造函数,而只有调用getinstance进行new操作的时候,才会对其调用构造函数,所以叫懒汉模式。
  • 相关阅读:
    Pycharm新建第一个Django项目
    Django的MTV模型
    TCP Retransmission 连接超时
    linux系统参数调优
    企业网站架构
    基于centos7,python3.7新建第一个Django项目
    运维日常错误总结(docker)
    docker常用技巧
    DHCP服务部署
    ssh远程登录故障解决方案
  • 原文地址:https://www.cnblogs.com/jobs1/p/10785486.html
Copyright © 2011-2022 走看看