首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
SAAS
ToB门户
了解全球最新的ToB事件
论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
微博
Follow
记录
Doing
博客
Blog
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
排行榜
Ranklist
相册
Album
应用中心
qidao123.com ToB IT社区-企服评测·应用市场
»
论坛
›
数据库
›
分布式数据库
›
怎样实现单例模式?
返回列表
发新帖
怎样实现单例模式?
[复制链接]
发表于 2025-12-1 14:46:04
|
显示全部楼层
|
阅读模式
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要
登录
才可以下载或查看,没有账号?
立即注册
×
概念
单例模式(Singleton Pattern)是一种筹划模式,确保一个类只有一个实例,并提供一个全局访问点。它常用于必要控制资源访问的场景,如
数据库
毗连、
日志
纪录大概设置管理等。
方式
懒汉式单例
懒汉式单例是在第一次被哀求时创建实例。为了确保线程
安全
,通常使用 std::mutex 举行掩护。
#include <iostream>
#include <mutex>
class Singleton {
public:
// 禁止拷贝构造和赋值
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;
static Singleton& getInstance() {
static Singleton instance; // 此时实例在第一次调用时创建
return instance;
}
void someMethod() {
std::cout << "Doing something in Singleton." << std::endl;
}
private:
Singleton() {
std::cout << "Singleton Constructor" << std::endl; // 建构函数
}
~Singleton() {
std::cout << "Singleton Destructor" << std::endl; // 析构函数
}
};
int main() {
Singleton::getInstance().someMethod(); // 访问单例
return 0;
}
复制
代码
代码
分析
私有构造函数:确保外部不能直接创建实例。
克制拷贝:复制构造函数和赋值运算符被删除,以防止复制。
静态局部变量:在静态方法 getInstance 中声明一个静态局部变量,这个变量 在第一次使用时初始化,后续调用将返回雷同的实例。
线程
安全
:C++11 及以上
版本
中,局部静态变量在多线程中是
安全
的,不必要额外的锁。
饿汉式单例
饿汉式单例在步调启动时就创建实例,岂论是否被使用。如许可以制止多线程中的同步题目,但在资源使用上大概会浪费。
#include <iostream>
class Singleton {
public:
// 禁止拷贝构造和赋值
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;
static Singleton& getInstance() {
return instance; // 直接返回实例
}
void someMethod() {
std::cout << "Doing something in Singleton." << std::endl;
}
private:
Singleton() {
std::cout << "Singleton Constructor" << std::endl; // 建构函数
}
~Singleton() {
std::cout << "Singleton Destructor" << std::endl; // 析构函数
}
static Singleton instance; // 静态实例
};
// 定义静态成员
Singleton Singleton::instance;
int main() {
Singleton::getInstance().someMethod(); // 访问单例
return 0;
}
复制
代码
代码分析
静态实例
:在类的内部声明一个静态成员 instance,在类外界说该成员。
构造函数
:与懒汉式雷同,构造函数和析构函数是私有的,以防止外部实例化。
线程安全的懒汉式单例(使用锁)
这种方法在创建单例实例时使用互斥锁来实现控制,确保多个线程差异时创建。
#include <iostream>
#include <mutex>
class Singleton {
public:
static Singleton* getInstance() {
std::lock_guard<std::mutex> lock(mu); // 加锁
if (!instance)
instance = new Singleton(); // 延迟加载
return instance;
}
void someMethod() {
std::cout << "Doing something in Singleton." << std::endl;
}
private:
Singleton() = default; // 私有构造函数
~Singleton() = default; // 私有析构函数
Singleton(const Singleton&) = delete; // 禁止拷贝构造
Singleton& operator=(const Singleton&) = delete; // 禁止赋值
static Singleton* instance; // 静态实例指针
static std::mutex mu; // 互斥量
};
// 定义静态成员
Singleton* Singleton::instance = nullptr;
std::mutex Singleton::mu;
int main() {
Singleton::getInstance()->someMethod(); // 访问单例
return 0;
}
复制代码
代码分析
互斥量
:使用 std::mutex 控制访问,以实现线程安全。每当访问 getInstance 时,lock_guard 主动加锁。
动态分配
:实例在初次访问时通过 new 创建,依靠用户在得当的位置调用 delete 烧毁对象。
接纳 std::call_once
C++11 中引入的 std::call_once 可以确保线程安全的单例实现。
#include <iostream>
#include <mutex>
class Singleton {
public:
static Singleton& getInstance() {
std::call_once(initInstanceFlag, &Singleton::initSingleton);
return *instance;
}
void someMethod() {
std::cout << "Doing something in Singleton." << std::endl;
}
private:
Singleton() {
std::cout << "Singleton Constructor" << std::endl;
}
~Singleton() {
std::cout << "Singleton Destructor" << std::endl;
}
static void initSingleton() {
instance = new Singleton();
}
static Singleton* instance;
static std::once_flag initInstanceFlag; // 初始化标志
};
// 静态成员初始化
Singleton* Singleton::instance = nullptr;
std::once_flag Singleton::initInstanceFlag;
int main() {
Singleton::getInstance().someMethod();
return 0;
}
复制代码
代码分析
std:
nce_flag
:用于包管指定的函数只被调用一次。
std::call_once
:确保在多线程情况下只会初始化一次实例。
总结
单例模式可以通过多种方式实现,包罗懒汉式、饿汉式、线程安全的懒汉式、使用 std::call_once 等。选择符合的实现方式紧张取决于项目标需求、线程安全需求以及怎样管理生命周期等因素。对于大多数情况,使用 C++11 提供的懒汉式联合 std::call_once 是最保举的做法,由于它既包管了线程安全,又轻巧易懂。
回复
使用道具
举报
返回列表
浏览过的版块
数据仓库与分析
移动端开发
Java
SQL-Server
物联网
Oracle
SAP
linux
人工智能
张春
+ 我要发帖
登录后关闭弹窗
登录参与点评抽奖 加入IT实名职场社区
去登录
微信订阅号
微信服务号
微信客服(加群)
H5
小程序
快速回复
返回顶部
返回列表