1、懒汉式(线程不安全)
懒汉式即按需创建实例,在第一次使用时才会创建。最简单的实现如下,但这种方式在多线程环境下可能不安全。
#include <iostream>
class Singleton {
private:
static Singleton* instance; // 唯一实例指针
Singleton() {} // 私有构造函数,防止外部直接创建对象
public:
// 获取唯一实例的函数
static Singleton* getInstance() {
if (instance == nullptr) {
instance = new Singleton();
}
return instance;
}
// 示例方法
void showMessage() {
std::cout << "Singleton Instance" << std::endl;
}
};
// 初始化静态成员
Singleton* Singleton::instance = nullptr;
int main() {
// 获取单例实例并调用方法
Singleton* singleton = Singleton::getInstance();
singleton->showMessage();
return 0;
}
2、 线程安全的懒汉式(加锁)
为了确保在多线程环境下的安全,我们可以使用 mutex
来保证线程安全。
#include <iostream>
#include <mutex>
class Singleton {
private:
static Singleton* instance;
static std::mutex mtx; // 锁
Singleton() {} // 私有构造函数
public:
// 获取唯一实例的函数
static Singleton* getInstance() {
if (instance == nullptr) {
std::lock_guard<std::mutex> guard(mtx); // 加锁
if (instance == nullptr) { // 双重检查
instance = new Singleton();
}
}
return instance;
}
// 示例方法
void showMessage() {
std::cout << "Singleton Instance" << std::endl;
}
};
// 初始化静态成员
Singleton* Singleton::instance = nullptr;
std::mutex Singleton::mtx;
int main() {
// 获取单例实例并调用方法
Singleton* singleton = Singleton::getInstance();
singleton->showMessage();
return 0;
}
3、饿汉式(线程安全)
饿汉式在程序开始时就创建单例实例,因此在多线程环境中天然安全,避免了懒汉式的锁机制。
#include <iostream>
class Singleton {
private:
Singleton() {} // 私有构造函数
public:
// 静态实例,程序开始时就创建
static Singleton& getInstance() {
static Singleton instance; // C++11 的局部静态变量,线程安全
return instance;
}
// 示例方法
void showMessage() {
std::cout << "Singleton Instance" << std::endl;
}
};
int main() {
// 获取单例实例并调用方法
Singleton& singleton = Singleton::getInstance();
singleton.showMessage();
return 0;
}