懒汉式就是用到的时候再实例化
饿汉式是初始化的时候已经实例化了
首先写懒汉式
#include<stdio.h>
#include<unistd.h>
#include<pthread.h>
class Singleton{
public:
static Singleton* getInstance(){
if(p == nullptr){
pthread_mutex_lock(&mutex);
if(p == nullptr){
p = new Singleton();
}
pthread_mutex_unlock(&mutex);
}
return p;
}
private:
static Singleton* p = nullptr;
static pthread_mutex_t mutex;
Singleton(){
pthread_mutex_init(&mutex, NULL);
}
~Singleton(){}
};
其中双检测if(p == nullptr)可以避免每次调用实例方法都进行加锁,如果已经完成实例创建,直接返回创建好的实例即可
可以使用函数局部静态对象 不用再加锁
class Singleton{
public:
static Singleton* getInstance(){
static Singleton *p;
return p;
}
private:
Singleton(){}
~Singleton(){}
};
饿汉式 程序运行时就定义了对象
class Singleton{
public:
static Singleton* getInstance();
private:
Singleton(){}
~Singleton(){}
static Singleton* p;
};
static Singleton* Singleton::p = new Singleton();
static Singleton* Singleton::getInstance(){
return p;
}
其实自己感觉 饿汉式就是getinstance之前创建好了实例,懒汉式就是调用getinstance时再创建实例
饿汉式需要注意的就是需要在getinstance之前必须创建好实例,不然返回的就是一个未定义的实例了
参考