c++实现线程安全的单例模式


title: 单例模式
categories: [设计模式]
tags: [单例模式]


我的私人博客

饿汉模式

#include <iostream>

using namespace std;

class HungrySingleton{
private:
    int count = 0;
    static HungrySingleton* instance;
    HungrySingleton() = default;
public:
    ~HungrySingleton() = default;
    static HungrySingleton* getInstance(){
        return instance;
    }
    void showMessage(){
        cout<<count<<endl;
    }
};

/* 初始化类静态变量 */
HungrySingleton* HungrySingleton::instance = new HungrySingleton();

int main(){
    HungrySingleton* object = HungrySingleton::getInstance();
    object->showMessage();
    return 0;
}

懒汉模式

线程安全(双重校验锁)

#include <iostream>
#include <mutex>

using namespace std;

class LazySingleton{
private:
    static LazySingleton* instance;
    static mutex _lock;
    int count = 1;
    LazySingleton() = default;
public:
    ~LazySingleton() = default;
    static LazySingleton* getInstance(){
        /* 缩小锁粒度,提高效率 */
        if(instance==nullptr){
            lock_guard<mutex> locker(_lock);
            if(instance== nullptr){
                instance = new LazySingleton;
            }
        }
        return instance;
    }
    void showMessage(){
        cout<<count;
    }
};

/* 初始化类静态变量 */
mutex LazySingleton::_lock;
LazySingleton* LazySingleton::instance = nullptr;

int main() {
    LazySingleton* object = LazySingleton::getInstance();
    object->showMessage();
    return 0;
}

线程安全(局部静态变量)

#include <iostream>

class LazySingleton{
private:
    int count = 1;
    LazySingleton() = default;
public:
    ~LazySingleton() = default;
    static LazySingleton* getInstance(){
        /* 局部静态变量只会在第一次声明的时候初始化,在c++11以及之后的版本可以做到线程安全 
        1.变量在代码第一次执行到变量声明的地方时初始化。
		2.初始化过程中发生异常的话视为未完成初始化,未完成初始化的话,需要下次有代码执行到相同位置时再次初始化。
        3.在当前线程执行到需要初始化变量的地方时,如果有其他线程正在初始化该变量,则阻塞当前线程,直到初始化完成为止。
        4.如果初始化过程中发生了对初始化的递归调用,则视为未定义行为
        */
        static LazySingleton instance;
        return &instance;
    }
    void showMessage(){
        cout<<count;
    }
};

int main() {
    LazySingleton* object = LazySingleton::getInstance();
    object->showMessage();
    return 0;
}
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值