您的位置:首页 > 编程语言 > C语言/C++

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

};

缺点:非完全线程安全

优点:1.多线程调用过程中只会创建一个实例,不会有懒汉式的创建多个实例问题;

            2.解决饿汉模式的隐晦问题

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++ singleton