美文网首页设计模式
单例模式双重锁定

单例模式双重锁定

作者: cx7 | 来源:发表于2019-03-21 23:34 被阅读0次

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

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;
    }

相关文章

网友评论

    本文标题:单例模式双重锁定

    本文链接:https://www.haomeiwen.com/subject/xpahvqtx.html