C++ 常用设计模式

1、单例模式

一个类只有一个实例,提供一个全局访问点来访问这个实例。

分为懒汉模式和饿汉模式:

  • 懒汉模式就是 只有用到这个实例才会初始化对象并返回 (调用了对外的接口才实例化对象)
  • 饿汉模式就是 不管用不用得到,都先构造出来,先初始化

双重锁的懒汉模式:

cpp 复制代码
#include <mutex>

class SingeLazy {
private:
	SingeLazy() {}
	SingeLazy(const SingleLazy& ) = delete;
	SingeLazy& operator= (const SingleLazy& ) = delete;
	static SingleLazy* instance;
	static mutex i_mutex;
	
public:
	static SingleLazy* getInstance() {
		if (instance == nullptr) {
			mutex.lock();
			if (instance == nullptr) {
				instance = new SingleLazy();
			}
			mutex.unlock();
		}
		return instance;
}
};
SingleLazy* SingleLazy::instance = nullptr;
mutex SingleLazy::i_mutex; // 类外初始化

双重锁机制(Double-Checked Locking)用于确保单例对象只被创建一次,并且提高线程安全性和性能。

为什么要进行第二次检查 if (instance == nullptr)

当第一个线程获得锁并创建单例对象时,其他等待的线程可能已经通过了第一次检查 if (instance == nullptr),并准备进入加锁阶段。如果没有第二次检查,当第一个线程释放锁之后,第二个线程会获得锁并尝试再次创建对象。

场景描述:

  • 线程A进入 getInstance(),通过了第一次检查,发现 instance == nullptr,然后加锁并创建实例。
  • 线程B几乎同时进入 getInstance(),也通过了第一次检查,因为当时 instance 还没被创建,但它被阻塞在锁等待状态。
  • 当线程A创建了实例并释放锁,线程B获得锁,并进入锁定区域。如果没有第二次检查,线程B会认为 instance 仍然是
    nullptr,并再次尝试创建实例。

因此,第二次检查的作用是防止在第一个线程创建实例后,其他线程重复创建实例

相关推荐
烤麻辣烫4 小时前
23种设计模式(新手)-9单例模式
java·开发语言·学习·设计模式·intellij-idea
资生算法程序员_畅想家_剑魔4 小时前
Java常见技术分享-设计模式的六大原则
java·开发语言·设计模式
刀法如飞4 小时前
从零手搓一个类Spring框架,彻底搞懂Spring核心原理
java·设计模式·架构设计
一条闲鱼_mytube5 小时前
智能体设计模式全景总结:21个模式快速串联指南
网络·设计模式
老蒋每日coding5 小时前
AI Agent 设计模式系列(十五)—— A2A Agent 间通信模式
人工智能·设计模式
Leo July6 小时前
【Java】Java设计模式实战指南:从原理到框架应用
java·开发语言·设计模式
老蒋每日coding8 小时前
AI Agent 设计模式系列(十四)—— 知识检索(RAG)模式
人工智能·设计模式·langchain
Yu_Lijing19 小时前
基于C++的《Head First设计模式》笔记——模式合作
c++·笔记·设计模式
S-X-S20 小时前
常用设计模式+集成websocket
websocket·设计模式
编程饭碗1 天前
【二十三种设计模式】
设计模式