单例模式:保证类只有一个实例且类易于外界访问,从而方便对实例个数的控制以及节约系统资源
参加《剑指offer》
#include <iostream>
using namespace std;
class singleton{
private:
singleton(){};
static singleton* Inst;
public:
static singleton* getIns(){
if(NULL == Inst){
Inst = new singleton();
printf("this is called\n");
}
return Inst;
}
};
singleton* singleton::Inst = NULL;
int main(){
singleton *ins = singleton::getIns();
system("pause");
}
多线程版本1:
#include <iostream>
using namespace std;
class singleton{
private:
singleton(){};
static singleton* Inst;
public:
static singleton* getIns(){
lock();
if(NULL == Inst){ // 得到锁后,只有当Inst为空时,才会去初始化实例
Inst = new singleton();
printf("this is called\n");
}
unlock();
return Inst;
}
};
singleton* singleton::Inst = NULL;
int main(){
singleton *ins = singleton::getIns();
system("pause");
}
由于每个线程去访问都要先获得锁,然后在检查Inst是否为空,在解锁,加锁成本非常高,优化见
多线程版本2:
#include <iostream>
using namespace std;
class singleton{
private:
singleton(){};
static singleton* Inst;
public:
static singleton* getIns(){
if(NULL == Inst){ // 只有Inst是NULL时,线程才会去创建对象的实例,所以加入延迟初始的策略
lock();
if(NULL == Inst){
Inst = new singleton();
printf("this is called\n");
}
unlock();
}
return Inst;
}
};
singleton* singleton::Inst = NULL;
int main(){
singleton *ins = singleton::getIns();
system("pause");
}