设计模式

单例模式双重锁定

2019-03-21  本文已影响0人  cx7

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

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;
    }
上一篇 下一篇

猜你喜欢

热点阅读