用C++实现单例模式
来源:互联网 发布:linux grep -ef|ps 编辑:程序博客网 时间:2024/05/16 16:58
什么是单例模式:一个类只有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享。
#include<iostream>using namespace std;#include<stdlib.h>//单例模式--》只能实现一个实例//多线程下不安全--》new Singleton不是原子操作//class Singleton//{//public://static Singleton* GetSingleton()//{//if(_inst==NULL)//{//_inst=new Singleton;//}//return _inst;//}//void Printf()//{//cout<<"Singleton: "<<_inst<<endl;//}//private://Singleton()//{}//~Singleton()//{}//Singleton(const Singleton&);//Singleton& operator=(const Singleton&);//static Singleton* _inst; //静态的成员在类外进行初始化//};//Singleton* Singleton::_inst =NULL;//懒汉模式--》线程安全情况---》加锁//#include<mutex.h>//class Singleton//{//public://static Singleton* GetSingleton()//{////当只有一个if时,不管_inst为不为空,都会获取锁,效率低//if(_inst==NULL) //{////lock(); pthread_mutex_lock 说明要加锁//lock_guard<mutex>lkl(_mux); ////c++11中用于加锁,它与metux配合使用,把锁放到它中,////mutex自动上锁,当它析构时,同时mutex解锁//if(_inst==NULL)//{//_inst=new Singleton;////它分为3步,1.分配空间,2.调用构造函数,3.赋值////编译器会对2 3步进行指令的交换,////那时线程会调用一个未初始化的对象,造成内存泄露////解决方案--》加入内存栏栅////Singleton* tmp=new Singleton;////Memorybarrier();////_inst=tmp;////}////unlock(); 解锁//}//return _inst;//}//void Printf()//{//cout<<"Singleton: "<<_inst<<endl;//}//private://Singleton()//{}//~Singleton()//{}//Singleton(const Singleton&);//Singleton& operator=(const Singleton&);//static Singleton* _inst; //静态的成员在类外进行初始化//static mutex _mux; // 保证多个线程公用一把互斥锁//};//Singleton* Singleton::_inst =NULL;//RAII--》实现一个自动管理锁的类//class AutoLock//{//public://AutoLock(const mutex& _mtx)//{//_mtx.lock();//}//~AutoLock()//{//_mtx.unlock();//}//};//class Singleton//{//public://static Singleton* GetSingleton()//{// if(_inst==NULL)// {//AutoLock(_mtx);//if(_inst==NULL)//{//_inst=new Singleton;// }// }//return _inst;//}//void Printf()//{//cout<<"Singleton: "<<_inst<<endl;//}//private://Singleton()//{}//~Singleton()//{}//Singleton(const Singleton&);//Singleton& operator=(const Singleton&);//static Singleton* _inst; //静态的成员在类外进行初始化// static mutex _mtx;//};//Singleton* Singleton::_inst =NULL;//饿汉模式--》不用加锁//方式1:在main函数之前就已经创建了对象//class Singleton//{//public://static Singleton* GetSingleton()//{//return _inst;//}//void Printf()//{//cout<<"Singleton: "<<_inst<<endl;//}//private://Singleton()//{}//~Singleton()//{}//Singleton(const Singleton&);//Singleton& operator=(const Singleton&);//static Singleton* _inst; //静态的成员在类外进行初始化//};//Singleton* Singleton::_inst =new Singleton;//饿汉模式--》不用加锁//方式2:在第一次调用时创建//class Singleton//{//public://static Singleton* GetSingleton()//{//static Singleton _inst; //创建一个静态的对象//return &_inst;//}//void Printf()//{//cout<<"Singleton: "<<endl;//}//private://Singleton()//{}//~Singleton()//{}//Singleton(const Singleton&);//Singleton& operator=(const Singleton&);//};//RAII 具有自动回收实例对象的方式//有一些文件锁,数据库...不会随着程序的关闭而立即释放资源,需要手动释放class Singleton{public:static Singleton* GetSingleton(){return _inst;}void Printf(){cout<<"Singleton: "<<_inst<<endl;}//垃圾回收类class GC{public:GC(){}~GC(){if(_inst){cout<<"delete _inst"<<endl;delete _inst;}}};private:Singleton(){}~Singleton(){}Singleton(const Singleton&);Singleton& operator=(const Singleton&);static Singleton* _inst; //静态的成员在类外进行初始化};Singleton* Singleton::_inst =new Singleton;void fun1(){Singleton::GC gc;Singleton* p1=Singleton::GetSingleton();Singleton* p2=Singleton::GetSingleton();Singleton* p3=Singleton::GetSingleton();p1->Printf ();p2->Printf ();p3->Printf ();}int main(){fun1();system("pause");return 0;}
阅读全文
0 0
- 设计模式--单例模式 C++实现
- (C++)用模板或宏实现单例模式
- (C++)用模板或宏实现单例模式
- Objective C 中实现单例模式
- Objective C 实现Singleton(单例)模式.
- Objective-C实现单例模式
- 【Objective-C】单例模式的实现
- objective-C 实现单例模式
- 单例模式代码实现(C++)
- 单例模式 (C语言实现)
- Objective-C实现单例模式
- Objective-C单例模式实现
- Objective-C 单例模式的实现
- Objective-c 实现单例设计模式
- c++--Singleton单例模式的实现
- 单例模式,C/C++实现
- 【C++】单例模式之C++实现
- C#单例模式
- Java注解@interface的用法【转】
- excel入门,如何玩转excel,你早该这么玩Excel笔记1
- NYOJ-剑客决斗-(动态规划)
- ZereneStacker 1.04 T201706121240 for Windows / Mac 焦点堆叠软件 简体中文 最新版汉化
- js 的 onblur 事件
- 用C++实现单例模式
- git关于文件权限修改引起的冲突及忽略文件权限的办法
- Java基本类型与引用类型
- adb无法使用,提示error: unknown host service的解决办法
- struts2如何对指定的方法进行验证?
- 洪水来袭,湖北700年古建筑屹立不倒,中国古代抗洪防涝建筑设计有多强?!
- 内容提供器(ContentResolver)---《第一行代码Android》笔记
- struts2默认能解决get和post提交方式的乱码问题吗?
- Linux 标准输入输出详解