【C++设计模式】单例模式

单例模式:保证一个类仅有一个实例

定义一个单例类:

1.私有化构造函数,以防止外界创建单例对象

2.用类的私有静态指针变量指向类的唯一实例

3.使用公有的静态方法获取实例

C++11规定了local static在多线程条件下的初始化行为,要求编译器保证了内部静态变量的线程安全性。在C++11标准下,《Effective C++》提出了一种更优雅的单例模式实现,使用函数内的 local static 对象。这样,只有当第一次访问getInstance()方法时才创建实例。这种方法也被称为Meyers' Singleton。

懒汉式

复制代码
class Singleton {
private:
    //构造函数私用化
    Singleton() {};
    ~Singleton() {};
    Singleton(const Singleton&);
    Singleton& operator=(const Singleton&);
    
public:
    //保证线程安全性
    static Singleton& getInstance() {
        static Singleton instance;
        return instance;
    }
};
复制代码

饿汉式

复制代码
class Singleton {
private:
    static Singleton instance;
private:
    //构造函数私用化
    Singleton() ;
    ~Singleton();
    Singleton(const Singleton&);
    Singleton& operator=(const Singleton&);
    
public:
    static Singleton& getInstance() {
        return instance;
    }
};
//初始化的地方
Singleton Singleton::instance;
复制代码

总结:

饿汉式虽然是线程安全的,懒汉式通常需要加锁来保证线程安全,但局部静态变量版本在C++11后是线程安全的。

 

c#里面的延迟初始化:

Lazy<T> 对象初始化默认是线程安全的,在多线程环境下,第一个访问 Lazy<T> 对象的 Value 属性的线程将初始化 Lazy<T> 对象,以后访问的线程都将使用第一次初始化的数据。

posted @   一只雷史莱姆  阅读(76)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示