【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 @ 2022-06-11 16:35  一只雷史莱姆  阅读(70)  评论(0编辑  收藏  举报