今天主要是学习了单例模式的三种实现,包括懒汉式、双重检查锁懒汉式和饿汉式。
首先,我们应该要理解单例模式的概念,单例模式简单的来说就是一个类只允许有一个对象,为此,我们可以知道必须要控制类的构造行为,故将构造函数私有化、同时将该类的对象
定义为该类的静态数据成员(因为构造函数被私有化了)。
- 首先是懒汉式,懒汉式理解起来最为直接,直接上代码
- #include "commonHeader.h"
-
- class lanhan {
- public:
- static lanhan * getInstance()
- {
- if (nullptr == instance)
- {
- instance = new lanhan();
- }
- return instance;
- }
- private:
- lanhan()
- {
- }
- static lanhan * instance;
- };
- lanhan * lanhan::instance = nullptr;
通过每次去判断instance是否为空,从而保证instace只会被初始化一次,但是这种保证只在单线程的情况下成立,当多个线程都对instace==nullptr进行判断时,instance无疑
还是会被执行多次。
2. 考虑到懒汉式在多线程下存在的问题,于是也有人提出了使用互斥锁来保证这一点,代码如下:
- #include <mutex>
- #include "commonHeader.h"
-
- class lanhanPlus
- {
- public:
- static lanhanPlus * getInstance()
- {
- if (nullptr == instance)
- {
- helpLock.lock();
- if (nullptr == instance)
- {
- instance = new lanhanPlus();
- }
- helpLock.unlock();
- }
- return instance;
- }
- private:
- lanhanPlus()
- {
- }
- static lanhanPlus * instance;
- static mutex helpLock;
- };
- lanhanPlus * lanhanPlus::instance = nullptr;
- mutex lanhanPlus::helpLock;
通过借助互斥锁的帮助,懒汉式在多线程环境下也能保证类达到单例的要求。同时这里通过两层判空的设定,不会对程序的性能造成太多的影响。
3. 饿汉式,饿汉式非常巧妙的借助了静态局部变量的特性,存储在静态区,作用域局部,只会在第一次定义时被初始化,非常完美,代码如下:
- #include "commonHeader.h"
-
- class ehan
- {
- public:
- static ehan * getInstance()
- {
- static ehan * instance;
- return instance;
- }
- private:
- ehan()
- {
- }
- };