懒汉单例模式 : 开始使用时才生成单例 典型的设计如下
class singleTon {
public:
static singleTon *getInstance() {
if (pSingleTon == nullptr) { //第一次判断 为了提高效率
pthread_mutex_lock(&mutex);
if (pSingleTon == nullptr) { //第二次判断 为了防止多线程重复生成对象
pSingleTon = new singleTon();
}
pthread_mutex_unlock(&mutex);
}
return pSingleTon;
}
protected:
singleTon() {
pthread_mutex_init(&mutex, NULL);
}
~singleTon() {
pthread_mutex_destroy(&mutex);
}
private:
static pthread_mutex_t mutex;
static singleTon *pSingleTon;
};
singleTon* singleTon::pSingleTon = nullptr;
pthread_mutex_t singleTon::mutex;
双重锁定 指的是构造函数中的两次判断
第一次判断为了提高效率 第二次为了防止多线程冲突
事实上第一次判断及时去掉,也能形成单例
加上第一次判断 是因为锁是不可减少的部分 但锁存在开销
懒汉单例如果已经生成了对象 就通过第一次判断 避免进行lock和unlock 提高程序效率
static singleTon *getInstance() {
if (pSingleTon == nullptr) { //第一次判断 为了提高效率
pthread_mutex_lock(&mutex);
if (pSingleTon == nullptr) { //第二次判断 为了防止多线程重复生成对象
pSingleTon = new singleTon();
}
pthread_mutex_unlock(&mutex);
}
return pSingleTon;
}
网友评论