单例模式

单例模式(Singleton Pattern)是一种创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点以访问该实例。单例模式通常涉及到延迟实例化(懒汉模式)或者在首次访问时创建实例,并确保在整个应用程序中只有一个实例存在。

要点:

  1. 私有构造函数: 单例类通常将其构造函数设置为私有,以防止外部直接实例化。
  2. 私有静态实例: 单例类通常包含一个私有的静态成员变量,用于保存实例。
  3. 公有静态方法: 提供一个公有的静态方法,用于获取该类的唯一实例。在这个方法中,通常会检查是否已经创建了实例,如果没有则进行实例化。

应用场景

  1. 全局配置:例如,日志配置、数据库连接池等。
  2. 全局访问点:例如,计数器、计时器等。
  3. 资源管理:例如,文件锁、打印机等。

示例代码

#include <iostream>
#include <mutex>

class ThreadSafeSingleton {
public:
    // 获取实例的静态方法
    static ThreadSafeSingleton& getInstance() {
        // 使用双检锁机制确保线程安全
        if (!instance) {
            std::lock_guard<std::mutex> lock(instanceMutex);  // 使用锁保护实例的创建
            if (!instance) {
                instance = new ThreadSafeSingleton();
            }
        }
        return *instance;
    }

    // 示例方法
    void showMessage() {
        std::cout << "Hello, I am a Thread-Safe Singleton!" << std::endl;
    }

private:
    // 将构造函数设为私有,防止外部实例化
    ThreadSafeSingleton() {}

    // 禁用拷贝构造和赋值运算符,确保只有一个实例
    ThreadSafeSingleton(const ThreadSafeSingleton&) = delete;
    ThreadSafeSingleton& operator=(const ThreadSafeSingleton&) = delete;

    // 静态实例
    static ThreadSafeSingleton* instance;
    // 互斥锁
    static std::mutex instanceMutex;
};

// 初始化静态成员变量
ThreadSafeSingleton* ThreadSafeSingleton::instance = nullptr;
std::mutex ThreadSafeSingleton::instanceMutex;

int main() {
    // 多线程环境下获取单例实例并调用示例方法
    #pragma omp parallel num_threads(4)
    {
        ThreadSafeSingleton& singletonInstance = ThreadSafeSingleton::getInstance();
        singletonInstance.showMessage();
    }

    return 0;
}