【Linux】多线程之单例模式

这篇具有很好参考价值的文章主要介绍了【Linux】多线程之单例模式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

创建模式中:

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

结构模式中:

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

行为模式中

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

单例模式

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

饿汉模式

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

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;
}

优点:第一次使用实例对象时,才会创建对象,进程启动无负载,多个单例实例启动顺序自由控制
缺点:复杂
文章来源地址https://www.toymoban.com/news/detail-647265.html

到了这里,关于【Linux】多线程之单例模式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Linux】简单线程池的设计与实现 -- 单例模式

    线程池: 一种线程使用模式。线程过多会带来调度开销,进而影响缓存局部性和整体性能。而 线程池维护着多个线程,等待着监督管理者分配可并发执行的任务 。这避免了在处理短时间任务时创建与销毁线程的代价。线程池不仅能够保证内核的充分利用,还能防止过分调度。

    2024年02月12日
    浏览(31)
  • linux线程池、基于线程池的单例模式、读者写者问题

    线程池: 一种线程使用模式。线程过多会带来调度开销,进而影响缓存局部性和整体性能。而线程池维护着多个线程,等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价。线程池不仅能够保证内核的充分利用,还能防止过分调度。

    2024年02月03日
    浏览(28)
  • [Linux] 最基础简单的线程池 及其 单例模式的实现

    本篇文章主要用到线程相关内容, 下面是博主关于线程相关内容的文章: [Linux] 线程同步分析:什么是条件变量?生产者消费者模型是什么?POSIX信号量怎么用?阻塞队列和环形队列模拟生产者消费者模型 [Linux] 线程互斥分析: 多线程的问题、互斥锁、C++封装使用互斥锁、线程安

    2024年02月16日
    浏览(26)
  • 【Linux】线程池设计/单例模式/STL、智能指针与线程安全/读者写者问题

    线程池:一种线程使用模式。线程过多会带来调度开销,进而影响缓存局部性和整体性能。而线程池维护着多个线程,等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价。线程池不仅能够保证内核的充分利用,还能防止过分调度。可

    2024年02月03日
    浏览(30)
  • 【Linux】生产者消费者模型:基于阻塞队列和环形队列 | 单例模式线程池

    死锁是指在一组进程中的各个进程均占有不会释放的资源,但因互相申请被其他进程所站用不会释放的资源而处于的一种永久等待状态。 当多线程并发执行并都需要访问临界资源时,因为每个线程都是不同的执行流,这就有可能 导致数据不一致问题 ,为了避免此问题的发生

    2024年01月24日
    浏览(30)
  • 【前端设计模式】之单例模式

    在前端开发中,单例模式是一种常见的设计模式,用于确保一个类只有一个实例,并提供全局访问点。在实现单例模式时,有一些最佳实践和高级技巧可以帮助我们编写更优雅和可维护的代码。 使用闭包是实现单例模式的一种常见方法。通过将类的实例保存在闭包中,并提供

    2024年02月09日
    浏览(33)
  • C++之单例模式

    单例模式(Singleton Pattern)是 面向对象中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式

    2024年01月23日
    浏览(41)
  • Java之单例模式

    目录 一.上节内容 1.什么是线程安全 2.线程不安全的原因 3.JMM(Java内存模型) 4.synchronized锁 5.锁对象 6.volatile 7.wait()和notify() 8.Java中线程安全的类 二.单例模式 1.什么是单例 2.怎么设计一个单例 1.口头约定 2.使用编程语言的特性 三.饿汉模式 四.懒汉模式 1.单线程下的懒汉模

    2024年02月04日
    浏览(42)
  • C#--设计模式之单例模式

    单例模式大概是所有设计模式中最简单的一种,如果在面试时被问及熟悉哪些设计模式,你可能第一个答的就是单例模式。 单例模式的实现分为两种: 饿汉式:在静态构造函数执行时就立即实例化。 懒汉式:在程序执行过程中第一次需要时再实例化。 两者有各自适用的场景

    2024年02月14日
    浏览(35)
  • c++设计模式之单例模式

    一个类无论创建多少对象 , 都只能得到一个实例 如上述代码中,我们通过new运算符创建出了类A的三个对象实例,而我们现在要做的是,如何设计类A,使得上述代码运行之后永远只产生同一个对象实例         我们知道,一个类对象是通过这个类的构造函数创建的,因此

    2024年01月19日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包