单例模式确保类唯一实例并提供全局访问点。1. 懒汉模式延迟创建但线程不安全;2. 双重检查锁定加互斥锁实现线程安全懒加载;3. 饿汉模式程序启动即创建,线程安全但影响启动性能;4. 局部静态变量利用c++11特性,线程安全且简洁推荐。

单例模式(Singleton Pattern)是一种创建型设计模式,确保一个类只有一个实例,并提供一个全局访问点。在C++中,实现单例模式需要考虑线程安全、构造函数私有化、禁止拷贝等细节。下面介绍几种常见的C++单例模式实现方式。
1. 懒汉模式(懒加载,线程不安全)
这种实现方式在第一次调用时才创建实例,但未考虑多线程环境下的竞争问题:
class Singleton { private: static Singleton* instance; Singleton() = default; // 私有构造函数 Singleton(const Singleton&) = delete; // 禁止拷贝 Singleton& operator=(const Singleton&) = delete; // 禁止赋值 public: static Singleton* getInstance() { if (instance == nullptr) { instance = new Singleton(); } return instance; } };
// 静态成员定义 Singleton* Singleton::instance = nullptr;
这种方式在多线程环境下可能创建多个实例,不适合并发场景。
2. 懒汉模式 + 双重检查锁定(线程安全)
使用互斥锁和双重检查机制,保证线程安全且只创建一次实例:
立即学习“C++免费学习笔记(深入)”;
#include class Singleton { private: static Singleton* instance; static std::mutex mtx; Singleton() = default; Singleton(const Singleton&) = delete; Singleton& operator=(const Singleton&) = delete;
public: static Singleton* getInstance() { if (instance == nullptr) { std::lock_guard lock(mtx); if (instance == nullptr) { instance = new Singleton(); } } return instance; } };
Singleton* Singleton::instance = nullptr; std::mutex Singleton::mtx;
这种写法避免了每次调用都加锁的性能损耗,适合多线程环境。
3. 饿汉模式(线程安全)
在程序启动时就创建实例,天然线程安全,因为没有延迟初始化的竞争问题:
class Singleton { private: static Singleton instance; Singleton() = default; Singleton(const Singleton&) = delete; Singleton& operator=(const Singleton&) = delete; public: static Singleton& getInstance() { return instance; } };
// 全局静态初始化 Singleton Singleton::instance;
优点是简单且线程安全,缺点是即使未使用也会被创建,可能影响启动性能。
4. 局部静态变量(推荐,C++11起线程安全)
C++11标准规定局部静态变量的初始化是线程安全的,这是最简洁且安全的实现:
class Singleton { private: Singleton() = default; Singleton(const Singleton&) = delete; Singleton& operator=(const Singleton&) = delete; public: static Singleton& getInstance() { static Singleton instance; // 局部静态变量,首次调用时初始化 return instance; } };
该方式自动管理生命周期,无需手动释放,代码简洁,推荐在现代C++中使用。
基本上就这些常见实现方式。选择哪种取决于你的需求:是否需要懒加载、是否多线程、是否追求简洁。对于大多数情况,局部静态变量方式是最优解。