目录
基本概念
单例模式以前都出过一个了,再次只粗略讲下!
单例模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点
其中UML图如下(来自于大话设计模式)
代码与实例
下面是最基础的单例模式!
运行截图如下:
代码如下:
Head.h
#ifndef HEAD_H
#define HEAD_H
#include <iostream>
#include <string>
#include <assert.h>
using namespace std;
class SingleTon{
public:
static SingleTon *getInstance(){
if(m_instance == nullptr){
m_instance = new SingleTon;
return m_instance;
}
return m_instance;
}
~SingleTon(){
cout << "~SingleTon() called!" << endl;
}
void toDoSometing(){
if(m_instance == nullptr){
assert(!"呵呵哒");
}
cout << this <<" 雅喵蝶 是一只大蝴蝶" << endl;
}
private:
SingleTon(){}
SingleTon(SingleTon &singleTon){}
static SingleTon *m_instance;
};
SingleTon *SingleTon::m_instance = nullptr;
#endif
main.cpp
#include "Head.h"
int main(int *argc, int *argv[]){
SingleTon *singleTon = nullptr;
singleTon = SingleTon::getInstance();
singleTon->toDoSometing();
SingleTon *hehe = nullptr;
hehe = SingleTon::getInstance();
hehe->toDoSometing();
delete singleTon;
getchar();
return 0;
}
这个是个很好的设计模式,但是在多线程中就要操作下了!
双重锁定!!!!
运行截图还是这样的,但加了1个锁,这个lock锁可以让其他线程都阻塞掉。
这个就是多线程单例,但是每次调用getInstance时候都需要lock,会影响性能。
下面这种方式为双重锁定,先判断实例是否存在,不存在在加锁处理
这里有个疑问:
外面以及判断了instance实例是否存在,为什么还要在lock里面做一次判断?这不是脱裤子打屁吗?
原因:当instance为null并且同时有2个线程调用getInstance方法时候,他们都会通过第一重的instance == null 的判断。然后由于lock机制,就只有一个线程能进入,另外一个线程等待,如果没有第二个判断,那么是不是就多new了空间,而且不能释放,是不是就变成了垃圾代码。
代码如下:
#ifndef HEAD_H
#define HEAD_H
#include <iostream>
#include <string>
#include <mutex>
#include <assert.h>
using namespace std;
mutex mt;
class SingleTon{
public:
static SingleTon *getInstance(){
if(m_instance == nullptr){
mt.lock();
if(m_instance == nullptr){
m_instance = new SingleTon;
mt.unlock();
return m_instance;
}
}
mt.unlock();
return m_instance;
}
~SingleTon(){
cout << "~SingleTon() called!" << endl;
}
void toDoSometing(){
if(m_instance == nullptr){
assert(!"呵呵哒");
}
cout << this <<" 雅喵蝶 是一只大蝴蝶" << endl;
}
private:
SingleTon(){}
SingleTon(SingleTon &singleTon){}
static SingleTon *m_instance;
};
SingleTon *SingleTon::m_instance = nullptr;
#endif