单例模式:懒汉式的两种优化写法

单例模式:全局唯一实例

懒汉式:获取时才初始化

①静态局部变量实现(Meyer's Singleton)【推荐】

cpp 复制代码
/*
类内创建自身实例的可行性分析:
  在C++中,类可以通过静态成员函数创建自身实例。这种机制的核心在于:
	1.构造函数必须设为private,防止外部直接实例化
	2.通过静态方法控制实例的创建过程(即静态成员函数)
	3.必须禁用拷贝构造函数和赋值运算符(= delete)
*/
class Single
{
private:
    Single(){}
    ~Single(){}
    Single(const Single& single){}=delete;
    Single& operator=(const Single& single){}=delete;
public:
    //获取实例,注意这个static修饰的是函数本身,表示是静态成员函数
    //static不能修饰返回值,这个函数的返回值类型是Single&
    static Single& getInstance()
    {
        //Single成为静态局部变量,天然线程安全,不需要锁来同步(编译器会自动插入互斥锁)
       	//无论调用 getInstance() 多少次,single只会初始化一次
    	static Single single_;
    	return single_;//可以返回静态局部变量的引用,因为函数销毁后,静态局部变量依然存在(生命周期直到程序结束)
	}
}

②使用双检锁,配合(类静态成员)智能指针【传统优化】

cpp 复制代码
#include <memory>
#include <mutex>

class Single
{
private:
    Single(){}
    ~Single(){}
    Single(const Single& single){}
    Single& operator=(const Single& single){}
private:
    //如果锁保护的变量是所有对象共享的,那么这个互斥量必须是静态变量
    static std::mutex mtx;//静态互斥量(所有对象公用这一个互斥量)
    //单例模式中,实例只有一个,所以这个智能指针也要是静态的,保证只有一个,并指向那个唯一实例
    static std::shared_ptr<Single> singlePtr;//静态智能指针
public:
    static std::shared_ptr<Single>& getInstance()
    {
        //因为实例只有一个,如果已经创建了,就不需要加锁了;只有没有实例才需要加锁
        if(!singlePtr)//用于提高效率
        {
            std::unique_lock<std::mutex> lock(mtx);
            //当多个线程同时通过第一次无锁检查(!singlePtr)时,这些线程会依次进入同步块(锁内代码)。此时,若没有第二次检查,每个获得锁的线程都会重新创建实例,导致单例失效。
            if(!singlePtr)//用于保证实例只创建一次
                singlePtr=std::make_shared<Single>();
		}
    }
};
std::mutex mtx;
std::shared_ptr<Single> singlePtr=nullptr;
相关推荐
谁似人间西林客2 天前
工业大数据实战:看中国智造如何用数据驱动效率革命
大数据·单例模式
张小姐的猫2 天前
【Linux】多线程 —— 线程池 | 单例模式 | 常见锁
linux·运维·服务器·c++·单例模式·设计模式·策略模式
Java面试题总结3 天前
双重检验锁的单例模式在高并发下的可见性问题
单例模式
珊瑚里的鱼6 天前
手撕单例模式中的饿汉模式和懒汉模式,懒汉模式还要再多加一个C++11版本的
开发语言·c++·单例模式
韩曙亮6 天前
【Flutter】Dart 单例 ( 单例模式核心规则 | 饿汉式单例 | 懒汉式单例 | 极简空安全 懒汉式单例 | 工厂构造函数单例 )
flutter·单例模式·dart·饿汉式单例·懒汉式单例·空安全·空赋值
wunaiqiezixin8 天前
如何在C++中实现一个单例模式?
c++·单例模式
basketball6168 天前
设计模式入门:1. 单例模式详解 C++实现
c++·单例模式·设计模式
bugcome_com8 天前
阿里云OSS工具类完整设计与实现:基于.NET的静态单例模式实践
阿里云·单例模式·.net·oss
JAVA9658 天前
JAVA面试-并发篇 03-使用synchronized doublecheck实现单例有什么坑
java·单例模式·面试