博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
单例模式
阅读量:5290 次
发布时间:2019-06-14

本文共 1296 字,大约阅读时间需要 4 分钟。

  单例模式功能:

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操作的时候,才会对其调用构造函数,所以叫懒汉模式。

 

转载于:https://www.cnblogs.com/jobs1/p/10785486.html

你可能感兴趣的文章
关于Mysql select语句中拼接字符串的记录
查看>>
动态规划 例子与复杂度
查看>>
安装webpack-dev-server后,npm run dev报错
查看>>
[BZOJ4567][SCOI2016]背单词(Trie+贪心)
查看>>
git回退到某个版本并提交
查看>>
查看oracle数据库的连接数以及用户
查看>>
简单几行js实现tab选项切换效果
查看>>
关于更改滚动条样式
查看>>
【数据结构】栈结构操作示例
查看>>
中建项目环境迁移说明
查看>>
三.野指针和free
查看>>
VIO的Bundle Adjustment推导
查看>>
activemq5.14+zookeeper3.4.9实现高可用
查看>>
asp.net FileUpload控件文件格式的判断及文件大小限制
查看>>
angular(1.5.8)
查看>>
h5的video标签支持的视频格式
查看>>
TCP/IP详解学习笔记(3)IP协议ARP协议和RARP协议
查看>>
简单【用户输入验证】
查看>>
学android:直接用jdk来helloworld
查看>>
Access Jira RESTful API by cURL
查看>>