单例模式Singleton Pattern

单例模式就是这个类有且只有一个实例对象,windows的任务管理器就是单例模式创建,其应用场景如线程池对象、注册表对象、打印机等硬件的驱动对象。

如何保证单例类只能被创建唯一的对象呢?
1、该类的构造函数是private或者protected属性。
2、该类提供一个public的静态成员函数,此函数返回该类的类型指针。

单例模式的分类

单例模式
懒汉形
饿汉形
懒汉形 线程不安全
懒汉形 加锁双检测模式 线程安全
饿汉形只有线程安全形

懒汉形,即很懒,只有用到的时候才创建唯一实例,饿汉形就像饿狼,程序一开始就创建了这个唯一实例。

优缺点:
懒汉啊,他很慢,因为需要他的时候他才开始做事情。
饿汉啊,他倒是快,可是他费性能,因为不需要他的时候他就开始做事情了,起的早,费粮食!

懒汉模式(线程不安全)

当同时有两个线程调用GetInsPtr()时,这不就两个线程都创建了实例了吗,就不是唯一的实例了,单例失败。
所以当没有多线程的情况,用以下的单例懒汉(线程不安全)代码。
若有多线程情况,请看后面的线程安全模式。

懒汉模式双检测加锁(线程安全)

由于存在多线程,故加锁,并两次判断唯一实例是否已经被创建。
为什么要检测两次?
答:在项目中,不是只有几个线程那么简单,有可能有大量的线程存在,频繁的加解锁,性能就完犊子了。
所以第一次检测:若对象已存在,就跳过吧,别管锁了。
有文章做过测试,两次检测的运行速度比一次的快32倍,具体的我没测,自己研究吧。
在这里插入图片描述

饿汉模式(线程安全)

饿汉模式由于是在程序开始就创建了唯一实例,不存在多线程同时访问的问题。
(但我本身还有一些疑问,我得再研究下,研究明白了也不想修改本文了,麻烦)
在这里插入图片描述

main函数 测试代码

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值