1. 单例模式基础与经典实现
单例模式是设计模式中最简单也最常用的一种,它确保一个类只有一个实例,并提供一个全局访问点。在C++中,单例模式通常用于管理全局资源,如配置信息、线程池、日志系统等。
1.1 单例模式的核心特性
单例模式需要满足三个基本特性:
- 唯一性:确保类只有一个实例存在
- 全局可访问:提供全局访问点
- 延迟初始化:在第一次使用时才创建实例
在C++中实现单例模式时,我们需要特别注意:
- 禁止外部实例化(私有构造函数)
- 禁止拷贝和赋值(删除拷贝构造函数和赋值运算符)
- 提供静态访问方法
1.2 经典单例实现(非线程安全版本)
下面是一个典型的非线程安全的单例实现:
cpp复制class Singleton {
public:
static Singleton& getInstance() {
if (!instance_) {
instance_ = new Singleton();
}
return *instance_;
}
// 删除拷贝构造函数和赋值运算符
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;
private:
Singleton() = default; // 私有构造函数
~Singleton() = default; // 私有析构函数
static Singleton* instance_;
};
// 静态成员初始化
Singleton* Singleton::instance_ = nullptr;
这个实现虽然简单,但在多线程环境下存在严重问题。当多个线程同时调用getInstance()时,可能会创建多个实例,违反了单例模式的基本原则。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 多线程环境下的单例安全问题
2.1 多线程竞态条件分析
让我们仔细分析经典实现中的竞态条件问题:
cpp复制static Singleton& getInstance() {
if (!ins
