C++ 单例模式(介绍+实现)
发布人:shili8
发布时间:2025-02-10 17:39
阅读次数:0
**C++ 单例模式**
###什么是单例模式?
单例模式是一种设计模式,它确保一个类在整个程序生命周期中只有一个实例。这个实例可以被多个线程或函数访问。
### 为什么需要单例模式?
在某些情况下,我们可能需要保证一个类的实例只有一份,这样可以避免资源浪费、减少内存占用等问题。例如,日志记录器、配置文件读取器等都可以使用单例模式来实现。
### 单例模式的实现####1. 线程不安全的实现
cppclass Singleton {
public:
static Singleton* getInstance() {
if (instance == nullptr) {
instance = new Singleton();
}
return instance;
}
private:
Singleton() {}
~Singleton() {}
static Singleton* instance;
};
在这个例子中,我们使用一个静态指针来存储实例。每次调用 `getInstance()` 方法时,会检查实例是否已经存在,如果不存在,就创建一个新的实例。
####2. 线程安全的实现(使用锁)
cppclass Singleton {
public:
static Singleton* getInstance() {
if (instance == nullptr) {
std::lock_guard<std::mutex> lock(mutex);
if (instance == nullptr) {
instance = new Singleton();
}
}
return instance;
}
private:
Singleton() {}
~Singleton() {}
static Singleton* instance;
static std::mutex mutex;
};
在这个例子中,我们使用一个互斥锁来保证线程安全。每次调用 `getInstance()` 方法时,会先获取锁,然后检查实例是否已经存在,如果不存在,就创建一个新的实例。
####3. 线程安全的实现(使用原子指针)
cppclass Singleton {
public:
static Singleton* getInstance() {
if (instance == nullptr) {
std::atomic atomicInstance(instance);
while (true) {
Singleton* current = atomicInstance.load();
if (current != nullptr || !atomicInstance.compare_exchange_strong(current, new Singleton())) {
break;
}
}
}
return instance;
}
private:
Singleton() {}
~Singleton() {}
static std::atomic instance;
};
在这个例子中,我们使用一个原子指针来保证线程安全。每次调用 `getInstance()` 方法时,会先检查实例是否已经存在,如果不存在,就创建一个新的实例。
### 总结单例模式是一种常见的设计模式,它可以保证一个类的实例只有一份。在实现中,我们需要考虑到线程安全的问题,并选择合适的方法来解决这个问题。使用锁、原子指针等技术都可以实现线程安全的单例模式。
### 参考* 《C++ Primer》第5 版* 《Effective C++》第3 版* 《Modern C++ Design》第1 版

