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.cpp
static 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;
}
};