单例模式双重锁定

懒汉单例模式 : 开始使用时才生成单例 典型的设计如下

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;
    }
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容