技术文摘
C++中单例的多种写法
2024-12-30 19:37:37 小编
C++中单例的多种写法
在 C++编程中,单例模式是一种常见且实用的设计模式。单例模式确保一个类只有一个实例存在,并提供全局访问点。下面我们来探讨几种常见的 C++中单例的写法。
懒汉式单例
懒汉式单例在第一次被调用时才创建实例。
class LazySingleton {
private:
static LazySingleton* instance;
LazySingleton() {}
public:
static LazySingleton* getInstance() {
if (instance == nullptr) {
instance = new LazySingleton();
}
return instance;
}
};
LazySingleton* LazySingleton::instance = nullptr;
饿汉式单例
饿汉式单例在程序启动时就创建实例。
class HungrySingleton {
private:
static HungrySingleton instance;
HungrySingleton() {}
public:
static HungrySingleton& getInstance() {
return instance;
}
};
HungrySingleton HungrySingleton::instance;
双重检查锁单例
这是一种优化的懒汉式单例,通过双重检查锁来提高性能。
class DoubleCheckSingleton {
private:
static DoubleCheckSingleton* instance;
static std::mutex mtx;
DoubleCheckSingleton() {}
public:
static DoubleCheckSingleton* getInstance() {
if (instance == nullptr) {
std::lock_guard<std::mutex> lock(mtx);
if (instance == nullptr) {
instance = new DoubleCheckSingleton();
}
}
return instance;
}
};
DoubleCheckSingleton* DoubleCheckSingleton::instance = nullptr;
std::mutex DoubleCheckSingleton::mtx;
静态局部变量单例
利用 C++中局部静态变量的特性实现单例。
class StaticLocalSingleton {
private:
StaticLocalSingleton() {}
public:
static StaticLocalSingleton& getInstance() {
static StaticLocalSingleton instance;
return instance;
}
};
不同的单例写法在不同的场景下各有优劣。懒汉式单例延迟创建实例,节省资源,但在多线程环境下可能存在问题;饿汉式单例简单直接,但可能在程序启动时就消耗不必要的资源;双重检查锁单例在多线程环境下性能较好,但代码相对复杂;静态局部变量单例写法简洁,线程安全。
在实际编程中,根据具体的需求和项目特点,选择合适的单例写法,能够有效地管理资源和提高程序的可维护性。
- 数据库自增 ID 跳过数字的原因解析
- MySQL 中 IFNULL() 与 NULLIF() 嵌套使用是否会导致性能损耗
- 在 SpringBoot 里怎样借助 Mybatis-Plus 对 MySQL Date 字段进行查询
- MySQL注释应使用单引号还是双引号
- Springboot查询MySQL DATE字段的方法
- SQL 语句联表查询时怎样去除重复字段
- 如何按 type 关联博客数量进行排序查询
- Nest 中遇到无法解析 BookService 依赖项错误的解决方法
- 如何解决MySQL子查询排序失效问题
- SpringBoot 如何正确查询 MySQL Date 字段
- SQL 查询:统计各 Type 对应的 Blog 数量并排序的方法
- 在 SpringBoot 里怎样查询 MySQL DATE 类型的日期
- 分表后怎样达成高效的排序分页查询
- 为何搜索引擎中MySQL倒排索引不常见
- Spring Boot查询MySQL DATE类型字段 后端打印日期为何变为Timestamp