单例用例(C++)简单分析
1-单例模式定义
单例模式是一种创建型设计模式,它确保一个类在程序运行期间只有一个实例存在,并提供一个全局访问点。这个模式在需要全局控制资源(如配置管理、日志系统、线程池等)时非常有用。
1.1 单例模式的特殊点
1.私有构造函数:防止外部通过new
关键字创建实例。
2.静态实例:通过静态成员变量或静态方法提供全局访问点。
3.防止拷贝构造和赋值操作:防止通过拷贝或赋值创建多个实例。
4.线程安全:在多线程环境下,确保单例的唯一性。
2-实现
我们这里实现有两种方式:1 懒汉式;2 饿汉式。
2.1- 懒汉式单例(Lazy )
优缺点分析:
优点
- 延迟初始化:实例在需要时才被创建,可以节省资源。
缺点
- 线程不安全:在多线程环境下,多个线程可能同时调用
getInstance()
,导致创建多个实例。 - 性能问题:每次调用
getInstance()
都需要进行线程同步,影响性能
代码实现:
class Singleton {
public:
// 提供一个全局访问点
static Singleton* getInstance() {
// 双重检查锁定,提高性能,并且在加锁前先检查实例是否已经创建,避免不必要的锁开销。
if (instance == nullptr) {
lock_guard<mutex> lock(mtx);
if (instance == nullptr) {
instance = new Singleton();
}
}
return instance;
}
// 防止拷贝构造和赋值操作
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;
private:
// 构造函数设为私有,防止外部创建实例
Singleton() {
cout << "Singleton instance created." << endl;
}
// 静态实例指针
static Singleton* instance;
// 互斥锁确保在多线程环境下只有一个线程能够创建实例。
static smutex mtx;
};
// 初始化静态成员
Singleton* Singleton::instance = nullptr;
mutex Singleton::mtx;
// 使用示例
int main() {
Singleton* s1 = Singleton::getInstance();
Singleton* s2 = Singleton::getInstance();
// 检查两个指针是否指向同一个实例
if (s1 == s2) {
cout << "s1 and s2 are the same instance." << endl;
}
else {
cout << "s1 and s2 are different instances." << sendl;
}
return 0;
}
2. 饿汉式单例(Eager )
优缺点分析
优点
- 线程安全:实例在程序启动时就被创建,避免了多线程环境下的竞争条件。
- 简单易用:实现简单,不需要额外的同步机制。
缺点
- 资源浪费:如果实例在程序运行期间从未被使用,会浪费内存资源。
- 启动时间增加:在实例创建过程中,如果初始化过程复杂,会增加程序的启动时间。
代码实现:
class Singleton {
public:
// 提供一个全局访问点
static Singleton& getInstance() {
return instance;
}
// 防止拷贝构造和赋值操作
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;
private:
// 构造函数设为私有,防止外部创建实例
Singleton() {
cout << "Singleton instance created." << endl;
}
// 静态实例在程序启动时就会被创建,静态存储区保证线程安全
static Singleton instance;
};
// 初始化静态成员
Singleton Singleton::instance;
// 使用示例
int main() {
Singleton& s1 = Singleton::getInstance();
Singleton& s2 = Singleton::getInstance();
// 检查两个引用是否指向同一个实例
if (&s1 == &s2) {
cout << "s1 and s2 are the same instance." << endl;
}
else {
cout << "s1 and s2 are different instances." << endl;
}
return 0;
}
如果有错误还请评论区纠正