首页 > 编程语言 >c++单例模式

c++单例模式

时间:2022-08-24 10:26:13浏览次数:55  
标签:11 Singleton nullptr 模式 init getSingleton 线程 c++ 单例

单例模式的意图:一个类只能有一个实例。

 

//非线程安全版本

 1 class Singleton{
 2 private:
 3     Singleton();
 4     Singleton(const Singleton &);
 5 public:
 6     static Singleton* init;
 7     static Singleton* getSingleton();
 8 };
 9 Singleton* Singleton::init = nullptr;
10 Singleton * Singleton::getSingleton() {
11     if(init == nullptr){
12         init = new Singleton();
13     }
14     return init;
15 }

 

//线程安全版本,但是加锁的代价过高

//多个线程读的时候其实不需要锁,面对高并发的情况,这个锁的代价比较高

Singleton * Singleton::getSingleton() {
    Lock lock;
    if(init == nullptr){
        init = new Singleton();
    }
    return init;
}

 

//双检查锁,但是由于内存读写reorder不安全。

//锁后检查避免多次实例,锁前检查防止两个线程都进了11行之后12行之前,lock等待了之后又实例化。

  Singleton * Singleton::getSingleton() {
11     if(init == nullptr){
12         Lock lock;
13         if(init == nullptr){
14             init = new Singleton();
15         }
16     }
17     return init;
18 }

第14行,执行的顺序是:1.先分配内存,2.调用构造器 3.把这片内存地址值返回给init;

但是由于线程在指令层次抢时间片;那么实际的执行指令顺序未必和上述相同。 

 

 

//c++11版本之后的跨平台实现

 

标签:11,Singleton,nullptr,模式,init,getSingleton,线程,c++,单例
From: https://www.cnblogs.com/cotoyo25/p/16618905.html

相关文章

  • Iterator设计模式
    迭代器设计模式用集合类实现Aggregate接口,并实现其iterator方法,生成特定的迭代器对象,但返回时返回为Iterator类型,以此来抽象编程,实现解耦合的目的。类图:   当使用......
  • 基于MFC和C++的校园导航系统
    基于MFC和C++的校园导航系统基于MFC和C++实现校园导航系统项目简介设计一款面向广大师生和外来办公或参观人员的校园导航系统,为校外人员来校办事提供便利。校园导航系......
  • 工厂模式-简单工厂
    publicinterfaceCar{Stringexcute();}publicclassBenchiCarimplementsCar{publicStringexcute(){System.out.println("奔驰车生产....");......
  • Netty - NIO 之 Selector模式
    一、总结豁然开朗,之前以为非阻塞的实现是因为selector。现在才知道selector的为了让非阻塞变成更好:无事件时,阻塞有事件时,非阻塞 二、背景知识2.1事件的类型 ......
  • C++ 函数重载
    1.C++可以使用同名函数[重载函数]实现功能类似的多个不同函数,C语言不支持函数重载;2.函数名重载即函数名相同,但是,函数的参数(形参)绝不相同:1)参数个数不同;2)或参数的类......
  • 设计模式10 - 设计模式 - 适配器设计模式(高频-结构型)
    一、定义适配器模式将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能在一起工作的那些类可以一起工作。    适配器模式......
  • C++ 默认参数
    1.C++支持函数的默认参数,C语言不支持;2.默认参数只能放在最后面。#include<iostream>#include<windows.h>#include<string>usingnamespacestd;voidscorePri......
  • 32位保护模式下的分段(GDT相关)
    (一)Intel系列微处理器的3种工作模式1.实模式工作方式相当于一个8086。在实模式下,用户程序对内存的访问非常自由,没有任何限制,随随便便就可以修改任何一个内存单元。......
  • C++一些新的特性的理解
    一、智能指针为什么需要智能指针?智能指针主要解决一下问题:内存泄漏:内存手动释放,使用智能指针可以自动释放共享所有权的指针的传播和释放,比如多线程使用同一个对象时......
  • C++ Primer“引用的引用”
    《C++primer》中有一句因为引用本身不是对象,所以不能定义引用的引用。inti=1024;int&a=i;int&b=a;容易引起误解,语句int&b=a;并没有语法错误。可以这......