懶漢單例模式 : 開始使用時才生成單例 典型的設計如下
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;
雙重鎖定 指的是構造函數(shù)中的兩次判斷
第一次判斷為了提高效率 第二次為了防止多線程沖突
事實上第一次判斷及時去掉,也能形成單例
加上第一次判斷 是因為鎖是不可減少的部分 但鎖存在開銷
懶漢單例如果已經生成了對象 就通過第一次判斷 避免進行l(wèi)ock和unlock 提高程序效率
static singleTon *getInstance() {
if (pSingleTon == nullptr) { //第一次判斷 為了提高效率
pthread_mutex_lock(&mutex);
if (pSingleTon == nullptr) { //第二次判斷 為了防止多線程重復生成對象
pSingleTon = new singleTon();
}
pthread_mutex_unlock(&mutex);
}
return pSingleTon;
}