单例模式 Singleton Pattern
单例模式就是这个类有且只有一个实例对象,windows的任务管理器就是单例模式创建,其应用场景如线程池对象、注册表对象、打印机等硬件的驱动对象。
如何保证单例类只能被创建唯一的对象呢?
1、该类的构造函数是private或者protected属性。
2、该类提供一个public的静态成员函数,此函数返回该类的类型指针。
单例模式的分类
懒汉形,即很懒,只有用到的时候才创建唯一实例,饿汉形就像饿狼,程序一开始就创建了这个唯一实例。
优缺点:
懒汉啊,他很慢,因为需要他的时候他才开始做事情。
饿汉啊,他倒是快,可是他费性能,因为不需要他的时候他就开始做事情了,起的早,费粮食!
懒汉模式(线程不安全)
当同时有两个线程调用GetInsPtr()时,这不就两个线程都创建了实例了吗,就不是唯一的实例了,单例失败。
所以当没有多线程的情况,用以下的单例懒汉(线程不安全)代码。
若有多线程情况,请看后面的线程安全模式。
懒汉模式双检测加锁(线程安全)
由于存在多线程,故加锁,并两次判断唯一实例是否已经被创建。
为什么要检测两次?
答:在项目中,不是只有几个线程那么简单,有可能有大量的线程存在,频繁的加解锁,性能就完犊子了。
所以第一次检测:若对象已存在,就跳过吧,别管锁了。
有文章做过测试,两次检测的运行速度比一次的快32倍,具体的我没测,自己研究吧。
饿汉模式(线程安全)
饿汉模式由于是在程序开始就创建了唯一实例,不存在多线程同时访问的问题。
(但我本身还有一些疑问,我得再研究下,研究明白了也不想修改本文了,麻烦)