线程安全的单例模式

STL是不是线程安全的?

不是,STL只考虑高效

智能指针是不是线程安全的?

大部分智能指针是安全的。智能指针 说白了 就是 指针管理。

什么是单例呢?

单例模式在任何时候只允许类最终定义一个对象

为什么要提一提单例呢?

因为后面网络服务器希望它是单例的,一个服务器一旦启动了那就一个启动就行了,不需要再用它的类创建更多的对象了。

另外线程池我也不想过多创建,一会总结线程池优缺点,再来谈一谈为什么要把他改成单例模式。

什么是设计模式?

编代码也是有方式的,发展这么多年大神们最后大家的代码都很类似,最后总结出一套模板,

这套模板也叫作编码的方式,我们称之为设计模式。

什么叫做编程最后大家代码都类似了呢?

先描述在组织 本质就是一套面向对象的思想,大部分语言都支持面向对象,这就是语言设计者发现都 大家使用时都一样,都需要面向对象,他不是语言必要的特征,他是计算机发展必然的阶段,大家刚开始你是你我是我,二进制,汇编,C的,VB VC。

单例模式分为两种理念

饿汉

吃完饭,立刻洗完,下一次直接就能拿着碗就能吃饭。

懒汉

吃完饭,先放下碗,下一次用时再洗 延时加载

举个例子

你申请内存空间时,只是在地址空间上允许你去访问,当你真正去访问时我们OS才会帮你缺页中断然后在内存里申请空间。本质是当我们需要时才给你。这就是延时加载的应用。

延时加载的好处是什么?

当你调用时,调用速度变快,启动时,启动的速度更快。

加载的时间总是需要花费的,所以我在你首次使用的时候再加载。

它并没有在整体上提高效率,因为我需要时你还是得加载,但是好处是我们创建对象,申请内存在时间的配比上发生了改变,现在是申请是申请,使用是使用,在局部上加快启动速度。

单例模式其实是语言级创建对象的方式,我们只考虑语言,不考虑操作系统会做什么。

static T data 类内静态全局数据,因为是静态的,在类里只有一份而且属于类不属于对象。

不管再怎么用Singleton定义对象它里面的静态成员只有一份。

问题

在C++中,拿类定义变量时,static 变量是什么时候就已经存在 了?

static 是静态全局数据,也是全局的一种,处理时和全局数据一模一样。

代码编译好后,把代码运行刚变成进程这些全局变量/静态变量就一定已经有了,不像栈区你需要的时候才有。

一定把语言和系统能够打通。比如你有一个类,类编译时有属性和方法,方法就到代码区了。

你怎么证明啊?

对象Init t 是在main函数的内部,也就是在栈上开辟的对象,三秒过后才输出构造时的打印,三秒前没创建对象。

如果t 在全局创建,

程序一起动hello world直接就被打印出来了,说明全局对象在启动时开始时就一定要有了,构造就要在运行时给你做了。

如果定义了很多全局对象,每一个全局对象都在运行时帮我们就创建出来了,所以注定了对象如果比较大它会影响加载速度。

全局对象是加载时就创建了,整个进程的生命周期从来不释放,他们的生命周期叫随进程,进程启动就加载,进程退出才让他释放,这不就是语言上全局变量具有全局性。

本质上不就是进程启动创建地址空间,完了之后释放地址空间。

饿汉模式启动时,类内有静态成员,在加载时要把对象创建出来了。


所以懒汉加载时只是一个指针

相关推荐
Sapphire~3 小时前
Linux-07 ubuntu 的 chrome 启动不了
linux·chrome·ubuntu
伤不起bb3 小时前
NoSQL 之 Redis 配置与优化
linux·运维·数据库·redis·nosql
广东数字化转型3 小时前
nginx怎么使用nginx-rtmp-module模块实现直播间功能
linux·运维·nginx
啵啵学习3 小时前
Linux 里 su 和 sudo 命令这两个有什么不一样?
linux·运维·服务器·单片机·ubuntu·centos·嵌入式
半桔4 小时前
【Linux手册】冯诺依曼体系结构
linux·缓存·职场和发展·系统架构
网硕互联的小客服4 小时前
如何利用Elastic Stack(ELK)进行安全日志分析
linux·服务器·网络·安全
冰橙子id5 小时前
linux——磁盘和文件系统管理
linux·运维·服务器
无聊的小坏坏6 小时前
环境变量深度解析:从配置到内核的全链路指南
linux·bash
才鲸嵌入式6 小时前
01 Ubuntu20.04下编译QEMU8.2.4,交叉编译32位ARM程序,运行ARM程序的方法
linux·c语言·单片机·嵌入式·arm·qemu·虚拟机
伤不起bb7 小时前
Kafka 消息队列
linux·运维·分布式·kafka