单例模式非常常用,客户端软件的话,主窗口只有一个通常就是采用单例模式。
主要思想,就是保证进程中只有一个实例对象。
//懒汉式
//懒汉式
class LazyMan{
private:
LazyMan(){
pthread_mutex_init(&mutex, NULL);
}
static pthread_mutex_t mutex;
public:
static LazyMan* getInstance(){
if(singleton == NULL){//如果已经创建了,就没有必要走下面的了
pthread_mutex_lock(&mutex);
if(singleton == NULL){
singleton = new LazyMan;
}
pthread_mutex_unlock(&mutex);
}
return singleton;
}
private:
static LazyMan* singleton;
};
pthread_mutex_t LazyMan::mutex = NULL;
LazyMan *LazyMan::singleton = NULL;
void test_lazyman()
{
LazyMan* lazyman01 = LazyMan::getInstance();
LazyMan* lazyman02 = LazyMan::getInstance();
if(lazyman01 == lazyman01){
cout << "equal" << endl;
}
}
// 饿汉式
class HungryMan{
private:
HungryMan(){}
public:
static HungryMan* getInstance(){
return singleton;
}
private:
static HungryMan* singleton;
};
HungryMan *HungryMan::singleton = new HungryMan;
void test_hungryman()
{
HungryMan* hungryman01 = HungryMan::getInstance();
HungryMan* hungryman02 = HungryMan::getInstance();
if(hungryman01 == hungryman02){
cout << "equal" << endl;
}
}
懒汉式存在多线程安全的问题. 上面代码对其进行了加锁改进。饿汉式比较简单,再运行之前就已经初始化了,多线程安全问题。是一种空间换便利的方案。