C++单例 singleton的实现

 

在这个单例模式的实现中,使用了静态局部变量来确保只有一个实例。

 

静态局部变量只会在第一次调用函数时初始化,并且在程序的整个生命周期内保持其值不变。

这意味着,无论多少次调用 getInstance() 方法,都只会在第一次调用时创建一个实例,后续的调用会返回同一个实例。

 

具体来说,在 getInstance() 方法中,静态局部变量 instance 在第一次调用时会被初始化,

然后该实例将一直存在于程序的整个生命周期中,直到程序结束。

因此,无论调用 getInstance() 方法多少次,都只会返回同一个实例。

 

#include <iostream>

class Singleton {
public:
    // 获取单例实例的静态方法
    static Singleton& getInstance() {
        // 使用静态局部变量确保线程安全的懒汉式单例模式
        static Singleton instance;
        return instance;
    }

    // 单例类的其他方法和成员
    void showMessage() {
        std::cout << "Hello, I am a singleton instance!" << std::endl;
    }

private:
    // 将构造函数和析构函数设为私有,防止外部创建和删除对象
    Singleton() {}
    ~Singleton() {}
    // 禁止复制和赋值操作,确保只有一个实例
    Singleton(const Singleton&) = delete;
    Singleton& operator=(const Singleton&) = delete;
};

int main() {

{ 
    // 获取单例实例
    Singleton& instance1 = Singleton::getInstance();   
    instance1.showMessage();
}

{ 
    // 获取单例实例
    Singleton& instance2 = Singleton::getInstance();   
    instance2.showMessage();

    // 获取单例实例
    Singleton& instance3 = Singleton::getInstance();  
    instance3.showMessage(); 
}

    return 0;
}

 

这个单例模式的实现是线程安全的,因为它使用了静态局部变量。在 C++11 标准及之后的标准中,静态局部变量的初始化是线程安全的。

当第一次调用 getInstance() 方法时,静态局部变量 instance 会被初始化,这个过程是线程安全的。具体来说,C++11标准保证了静态局部变量的初始化是线程安全的,因为编译器会生成线程安全的代码来确保静态局部变量只会被初始化一次,即使在多线程环境下也不会出错。

因此,这个单例模式是线程安全的,可以在多线程环境中安全地使用。

 

posted @ 2024-03-10 21:22  He_LiangLiang  阅读(6)  评论(0编辑  收藏  举报