【Linux】多线程之单例模式

news/2024/7/3 0:19:56

多线程之单例模式

  • 什么是设计模式,都有哪些设计模式
  • 单例模式
    • 饿汉模式
    • 懒汉模式

什么是设计模式,都有哪些设计模式

设计模式就是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。

创建模式中:

抽象工厂模式 ,提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
生成器模式,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
工厂方法模式,定义一个用于创建对象的接口,让子类决定将哪一个类实例化。工厂方法使一个类的实例化延迟到其子类。
原型模式,用原型实例指定创建对象的种类,并且通过拷贝这个原型来创建新的对象。
单例模式,保证一个类仅有一个实例,并提供一个访问它的全局访问点。

结构模式中:

适配器模式,将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
桥接模式,将抽象部分与它的实现部分分离,使它们都可以独立地变化。
组合模式,将对象组合成树形结构以表示“部分-整体”的层次结构。它使得客户对单个对象和复合对象的使用具有一致性。
容器模式
修饰模式,动态地给一个对象添加一些额外的职责。就扩展功能而言, 它比生成子类方式更为灵活。 扩展性模式 外观模式
享元模式
管道与过滤器模式
代理模式,为其他对象提供一个代理以控制对这个对象的访问。

行为模式中

责任链模式,为解除请求的发送者和接收者之间耦合,而使多个对象都有机会处理这个请求。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它。
命令模式,将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可取消的操作。

单例模式

一个类只能创建一个对象,即单例模式,该模式可以保证系统中该类只有一个实例,并提供一个 访问它的全局访问点,该实例被所有程序模块共享,而单例模式有两种实现模式:懒汉模式和饿汉模式

饿汉模式

这个单例类对象,在程序启动之初就直接创建(由于定义了一个静态的类对象)

class Singleton
 {
  public:
      static Singleton* GetInstance()
     {
          return &m_instance;
     }
  private:
     // 构造函数私有
    Singleton(){};
    
    // C++98 防拷贝
    Singleton(Singleton const&); 
    Singleton& operator=(Singleton const&); 
      
    // or
      
    // C++11
    Singleton(Singleton const&) = delete; 
    Singleton& operator=(Singleton const&) = delete; 
  
    static Singleton m_instance;
 };
  
  Singleton Singleton::m_instance;

优点:实现简单,适用于多线程高并发环境下使用饿汉模式创建的单例类可以避免资源竞争
缺点:可能会导致进程启动慢,如果有多个单例类对象启动时顺序是不确定的

懒汉模式

这个单例对象,只有在程序被调用的时候,才去创建类的对象(根本原因是定义了一个静态的类对象指针)

class Singleton
{
 public:
 static Singleton* GetInstance() {
 // 注意这里一定要使用Double-Check的方式加锁,才能保证效率和线程安全
 	if (nullptr == m_pInstance) {
 		m_mtx.lock();
 		if (nullptr == m_pInstance) {
 			m_pInstance = new Singleton();
 		}
 		m_mtx.unlock();
 	}
 	return m_pInstance;
 }
	// 实现一个内嵌垃圾回收类    
 	class CGarbo {
 	public:
 		~CGarbo(){
 			if (Singleton::m_pInstance)
 				delete Singleton::m_pInstance;
 			}
 	};
 // 定义一个静态成员变量,程序结束时,系统会自动调用它的析构函数从而释放单例对象
 static CGarbo Garbo;
 private:
 // 构造函数私有
 	Singleton(){};
 // 防拷贝
 	Singleton(Singleton const&);
 	Singleton& operator=(Singleton const&);
 	static Singleton* m_pInstance; // 单例对象指针
 	static mutex m_mtx;   //互斥锁
};
Singleton* Singleton::m_pInstance = nullptr;
Singleton::CGarbo Garbo;
mutex Singleton::m_mtx;
int main()
{
 	thread t1([]{cout << &Singleton::GetInstance() << endl; });
 	thread t2([]{cout << &Singleton::GetInstance() << endl; });
 	t1.join();
 	t2.join();
 	cout << &Singleton::GetInstance() << endl;
 	cout << &Singleton::GetInstance() << endl;
 	return 0;
}

优点:第一次使用实例对象时,才会创建对象,进程启动无负载,多个单例实例启动顺序自由控制
缺点:复杂


http://lihuaxi.xjx100.cn/news/1441430.html

相关文章

[C++ 网络协议编程] TCP/IP协议

目录 1. TCP/IP协议栈 2. TCP原理 2.1 TCP套接字中的I/O缓冲 2.2 TCP工作原理 2.2.1 三次握手&#xff08;连接&#xff09; 2.2.2 与对方主机的数据交换 2.2.3 四次握手&#xff08;断开与套接字的连接&#xff09; TCP&#xff08;Transmission Control Protocol传输控…

期权定价模型系列【5】—ETF期权数据

1.前言 对期权定价模型进行研究时&#xff0c;往往需要匹配的实际数据&#xff0c;国内上市时间超过两年、主流的ETF期权包括华夏上证50ETF期权、沪深300ETF期权等&#xff0c;其对应的标的资产分别为华夏上证50ETF、华泰柏瑞沪深300ETF、嘉实沪深300ETF。 2.上证50ETF期权合约…

Android应用开发(37)LTPO帧率测试基于Surfaceview

Android应用开发学习笔记——目录索引 参考android官网&#xff1a; Frame rate | Android media | Android Developers多重刷新率 | Android 开源项目 | Android Open Source ProjectWindowManager.LayoutParams | Android Developers 目前市面上旗舰手机基本都是…

什么是CSS中的渐变(gradient)?如何使用CSS创建线性渐变和径向渐变?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 渐变&#xff08;Gradient&#xff09;在CSS中的应用⭐ 线性渐变&#xff08;Linear Gradient&#xff09;语法&#xff1a;示例&#xff1a; ⭐ 径向渐变&#xff08;Radial Gradient&#xff09;语法&#xff1a;示例&#xff1a; ⭐ 写…

16收16发ARINC429模块

6通道发送&#xff0c; 16通道接收 发送通道: 每路发送通道FIFO大小为&#xff1a;511 x 32bit(CHR32216/32316) &#xff0c;缓存256条发送消息(CHR32216-EX/32316-EX) 发送FIFO可设置复位 可设置消息间隔&#xff0c; 字间隔和发送帧的预定数呈 发送波特率100Kbps、50Kbps、…

LeetCode 36题:有效的数独

题目 请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 &#xff0c;验证已经填入的数字是否有效即可。 数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。&#xff08;请参考示例图&#xff…

PAT(Advanced Level)刷题指南 —— 第九弹【Dijkstra + DFS】

一、1018 Public Bike Management 1. 问题重述 杭州市设有公共自行车服务,为来自世界各地的游客提供了极大的便利。可以在任何车站租用一辆自行车,然后将其还给城市中的其他车站。 公共自行车管理中心(PBMC)不断监视所有站点的实时容量。如果工作站刚满一半,则称其处于理…

免费开源的多种人工智能项目,比如:训练一个模型,让人工智能玩王者荣耀

免费开源的多种人工智能项目&#xff0c;比如&#xff1a;训练一个模型&#xff0c;让人工智能玩王者荣耀。 全文大纲 PULSE - 该开源项目可以通过给图片增加像素点来实现去马赛克或高清化。 Depix - 给打了马赛克的文字去码。 TecoGAN - 给视频去马赛克或者进行超分辨率。 Sk…