三种单例模式的实现(C++)
今天主要是学习了单例模式的三种实现,包括懒汉式、双重检查锁懒汉式和饿汉式。
首先,我们应该要理解单例模式的概念,单例模式简单的来说就是一个类只允许有一个对象,为此,我们可以知道必须要控制类的构造行为,故将构造函数私有化、同时将该类的对象
定义为该类的静态数据成员(因为构造函数被私有化了)。
- 首先是懒汉式,懒汉式理解起来最为直接,直接上代码
#include "commonHeader.h" class lanhan { public: static lanhan * getInstance() { if (nullptr == instance) { instance = new lanhan(); } return instance; } private: lanhan() { } static lanhan * instance; }; lanhan * lanhan::instance = nullptr;
通过每次去判断instance是否为空,从而保证instace只会被初始化一次,但是这种保证只在单线程的情况下成立,当多个线程都对instace==nullptr进行判断时,instance无疑
还是会被执行多次。
2. 考虑到懒汉式在多线程下存在的问题,于是也有人提出了使用互斥锁来保证这一点,代码如下:
#include <mutex> #include "commonHeader.h" class lanhanPlus { public: static lanhanPlus * getInstance() { if (nullptr == instance) { helpLock.lock(); if (nullptr == instance) { instance = new lanhanPlus(); } helpLock.unlock(); } return instance; } private: lanhanPlus() { } static lanhanPlus * instance; static mutex helpLock; }; lanhanPlus * lanhanPlus::instance = nullptr; mutex lanhanPlus::helpLock;
通过借助互斥锁的帮助,懒汉式在多线程环境下也能保证类达到单例的要求。同时这里通过两层判空的设定,不会对程序的性能造成太多的影响。
3. 饿汉式,饿汉式非常巧妙的借助了静态局部变量的特性,存储在静态区,作用域局部,只会在第一次定义时被初始化,非常完美,代码如下:
#include "commonHeader.h" class ehan { public: static ehan * getInstance() { static ehan * instance; return instance; } private: ehan() { } };
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话