单例模式(Singleton Pattern)是一种创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点以访问该实例。单例模式通常涉及到延迟实例化(懒汉模式)或者在首次访问时创建实例,并确保在整个应用程序中只有一个实例存在。
要点:
- 私有构造函数: 单例类通常将其构造函数设置为私有,以防止外部直接实例化。
- 私有静态实例: 单例类通常包含一个私有的静态成员变量,用于保存实例。
- 公有静态方法: 提供一个公有的静态方法,用于获取该类的唯一实例。在这个方法中,通常会检查是否已经创建了实例,如果没有则进行实例化。
应用场景
- 全局配置:例如,日志配置、数据库连接池等。
- 全局访问点:例如,计数器、计时器等。
- 资源管理:例如,文件锁、打印机等。
示例代码
#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;
}