首页 > 其他分享 >一些小问题和单例模式:饿汉模式和懒汉模式

一些小问题和单例模式:饿汉模式和懒汉模式

时间:2023-05-20 23:33:07浏览次数:33  
标签:饿汉 模式 线程 单例 构造函数 懒汉 指针

智能指针的使用是一种思想,他利用类去管理系统的资源,在一些地方很巧妙的处理了编码不好处理的地方。

如下图:

 如果是这样一种情况,这个throw抛异常了,此时跳出到catch的地方,处理完程序后再次使用fun函数此时被锁住了,坏了。所以可以用一个类去管理这个锁,使其除了生命周期后自动析构解锁,这个类的构造函数自动上锁,析构函数自己解锁。如下图所示:

 

以上费了这么大功夫就是为了处理内存泄露的问题,内存泄露的危害很大。

他会让可用内存越来越小,机器越来越慢,这在服务器上是致命的。一次泄露很多没事,很快就能找到,就怕一次泄露一点点,最后崩掉了。

所以不好处理的地方尽量去用智能指针,如果怀疑内存泄漏可以用专用工具去检测。

特殊类的设计:

一般要求的特殊类比如:设计一个类不可以被继承,这个类只能在堆上或者是栈上,

对于不可以被继承:

此时就可以私有化构造函数,使其不可以被继承,因为派生类的初始化必须先初始化基类,然而基类的构造函数私有化了。就不可以继承了或者直接用delete关键字修饰基类的构造函数。

只能在堆上:

定义一个类,将这个类的默认构造函数私有,然后给一个函数接口,返回这个类的堆上的指针,如图:因为只能定义在堆上所以开始没有实例化对象,只能用类名去调用静态函数来构造一个类的指针,

 栈上也一样,将默认构造函数私有禁用,然后留一个返回实例化对象的接口,

也可以用类operator new然后禁用他使其只能在栈上构造。

设计模式:一个反复被大家使用的代码编造方式,比如迭代器,适配器这样的。

单例模式;全局只能有一个的的类:

思路:首先将这个类的构造函数私有化,然后成员变量是这个类的指针并且是一个静态变量,实现一个静态接口返回这个类的指针,并在实现的过程中加一个判断如果成员变量为空则实例化一个对象,如果不为空,返回这个静态变量,因为静态变量是共用的,所以都可以访问到。这样无论调用几次这个构建函数,如果静态区有东西就返回静态区的东西并不会在构造第二个。

这是针对于一个线程的情况,如果两个线程同时实例化这个对象,就会引发线程安全问题。在首次可能会多实例化几个对象。

这时就需要上锁了,然后因为只有第一次开始时引发线程安全问题,所以只有在类的指针为空时进行上锁:如图:

 这里就用了类似于智能指针的unique_mutex.控制锁的生命周期。

上面是懒汉模式;在需要用的时候去初始化对象。

还有一种是饿汉模式:他在main函数之前初始化对象,这避免了线程安全问题。

对比懒汉模式饿汉模式的类成员变量不是指针是类本身,因为静态变量在main函数之前初始化,所以类的是类对象在这之前就初始化好了,main线程进去不用构造第一个对象直接就可以用,所以不会引发线程安全问题。

但是一般项目或者网页都使用懒汉模式,因为饿汉模式需要一次将全部的资源加载完,会很费时间,还有就是有一些有相互依赖的类,需要先生成前置类之后才能生成目标类,因为位饿汉模式不能保证实例化的顺序,需要手动在懒汉模式下调整。下图贴上懒汉模式的代码样例:

 

标签:饿汉,模式,线程,单例,构造函数,懒汉,指针
From: https://www.cnblogs.com/qjwxlj/p/17418025.html

相关文章

  • 实际业务中使用策略模式对代码进行重构
    一.业务描述最近在负责公司一个语音的微服务模块优化,这个模块主要的业务是:1.天猫精灵、小度、若琪、小京鱼、小爱同学、思必驰这些第三方音响对我们的用户进行oauth2/JWT授权; 2.这些第三方音响服务调用我们的设备发现接口对公司的设备信息在第三方平台进行一个存储;3.第三方平台......
  • 适配器模式改造Servlet
    1. 我们编写一个Servlet类直接实现Servlet接口有什么缺点?  11  - 我们只需要service方法,其他方法大部分情况下是不需要使用的。代码很丑陋。2. 适配器设计模式Adapter   11  - 手机直接插到220V的电压上,手机直接就报废了。怎么办?可以找一个充电器。这个充电器就是一个......
  • 聊聊Seata分布式解决方案AT模式的实现原理
    什么是Seata分布式事务解决方案Seata是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。为用户提供了AT、TCC、SAGA和XA事务模式,为用户打造一站式的分布式解决方案。AT模式AT模式目前来看是Seata框架独有的一种模式,其它的分布式框架上并没有此种模式......
  • RabbitMQ工作模式-Routing模式
    路由模式:1、每个消费者监听自己的队列,并且设置routingkey。2、生产者将消息发给交换机,由交换机根据routingkey来转发消息到指定的队列。 Routing模式是可以完成订阅模式的工作的,下面的代码在RoutingKey为“inform”的消息中有所体现示例代码:生产者:publicclassP......
  • 我写了本开源书:《3D编程模式》
    大家好,我写了本开源书,罗列了我从自己的实战项目中提炼出来的关于3D编程(主要包括“3D引擎/游戏引擎”、“编辑器”开发)的各种编程模式本书的在线阅读地址在这里:在线阅读本书的源码在Github中,欢迎star,感恩您:Github地址本书的写作花了我300多个小时,将近3个月的全职写作,凝结了我一......
  • 新高考模式志愿填报
    注意志愿之间梯度的问题,建议高、中、低搭配填报,较为合理,避免退档风险。注意志愿之间梯度的问题,建议高、中、低搭配填报,较为合理,避免退档风险。 4、新高考模式下,专业平行志愿填报有哪些参考策略?答:填报高考志愿方法很多,可根据不同情况先选院校再选专业,或者先选专业再选院校,只要......
  • oracle 中的用户、表空间、数据模式光速入门
    oracle中没有limitROWNUM来处理的只能通过嵌套来处理SELECT*FROM(SELECTCOMP_LN.GIM_RENKOU.LASTUPTIMEFROMCOMP_LN.GIM_RENKOUORDERBYCOMP_LN.GIM_RENKOU.LASTUPTIMEDESC)WHEREROWNUM=1oracle首先连接的时候分为servicename和SID(SystemIdentifi......
  • 动态创建ACTIVITY模式
    还记得我们在代理Activity模式里谈到启动插件APK里的Activity的两个难题吗,由于插件里的Activity没在主项目的Manifest里面注册,所以无法经历系统Framework层级的一系列初始化过程,最终导致获得的Activity实例并没有生命周期和无法使用res资源。使用代理Activit......
  • 从零玩转设计模式之单例模式-danlimos
    title:从零玩转设计模式之单例模式date:2022-12-1212:41:03.604updated:2022-12-2315:35:29.0url:https://www.yby6.com/archives/danlimoscategories:-单例模式-设计模式tags:-Java模式-单例模式-设计模式前言单例设计模式是23种设计模式中最常用的设......
  • 从零玩转设计模式之建造者模式-jianzaozhemoshi
    title:从零玩转设计模式之建造者模式date:2022-12-0818:15:30.898updated:2022-12-2315:35:58.428url:https://www.yby6.com/archives/jianzaozhemoshicategories:-设计模式tags:-设计模式-建造者模式什么是建造者模式?建造者模式是一种软件设计模式,它用于......