C++单例模式对比
2016-07-07 11:10
225 查看
1.懒汉式
class singleton{private:
singleton(){};
~singleton(){};
static singleton* single;
...
public:
static singleton* getInstance(){
if(!single){
single = new singleton();
}
return single;
}
}
优点:第一次调用时才创建single;
缺点:每次都要判断single,多线程调用过程中可能会创建多个实例;
比如,线程1执行getInstance时single=null 执行 new singleton。在这个过程中线程进入,若此时线程1还没有完成single创建,线程2 执行new singleton。
两个线程获取到不同的single对象。
2.饿汉式
A.cppstatic int ref = 100; //单元A中非局部静态变量
B.cpp
class singleton2{
private:
int singleref = 0;
singleton2(){ //singleton2在初始化时依赖 A中ref;
singleref = ref;
};
~singleton2(){};
static singleton single; // single初始化时要依赖 A中ref 但这时 A中ref可能还未初始化
...
public:
static singleton2& getInstance(){
return single;
}
}
优点:不用每次判断single是否为空
缺点:饿没式有个比较隐晦的问题。
如:如果single2中的 single对象初始化时A中的ref可能还未初始化,这时获得的single对象是有问题的, 这个和C++编译顺序有关. Meyers模式解决了这一问题3.Meyers单例
class Meyers{private:
char* name;
Meyers(char* a): name(a){
cout<<name<<" construct" <<endl;
}
~A(){
cout<<name<<" Destroy" <<endl;
}
public:
static Meyers& getInstance(){
static A a("Meyers_Singleton ");
return a;
}
};
缺点:非完全线程安全
优点:1.多线程调用过程中只会创建一个实例,不会有懒汉式的创建多个实例问题;
2.解决饿汉模式的隐晦问题
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- C++联合体转换成C#结构的实现方法
- C++高级程序员成长之路
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结
- 使用Lua来扩展C++程序的方法
- C++中调用Lua函数实例
- Lua和C++的通信流程代码实例
- C++的template模板中class与typename关键字的区别分析
- C与C++之间相互调用实例方法讲解