-------------------------------------------最简单的单线程下的单例模式-------------------
-----.h文件-----
class SingletTon
{
public:
~SingletTon();
public:
static SingletTon *getInstance(); // 获取唯一实例的静态函数
private:
SingletTon();
private:
static SingletTon *m_pInstance; // 本类的私有静态成员
};
-----CPP文件----
SingletTon * SingletTon::m_pInstance = NULL; // 本类的静态成员的初始化操作
SingletTon * SingletTon::getInstance()
{
if (m_pInstance == NULL)
{
m_pInstance = new SingletTon();
}
return m_pInstance;
}
在多线程环境下时候,需要在代码中加锁。
加锁后实现:
SingletTon * SingletTon::getInstance()
{
lock();
if (m_pInstance == NULL)
{
m_pInstance = new SingletTon();
}
unlock();
return m_pInstance;
}
但是这样在线程数量多时候会出现阻塞问题:
原因(每次判断实例为空时候都要被锁定,这样很多的线程都会在判空之前被锁定,造成阻塞)
用双重锁定来解决:
SingletTon * SingletTon::getInstance()
{
if (m_pInstance == NULL)
{
lock();
if (m_pInstance == NULL)
{
m_pInstance = new SingletTon();
}
unlock();
}
return m_pInstance;
}
------------------------------------------------------------------
单例模式分为懒汉模式和饿汉模式
懒汉:即不到万不得已不创建对象实例,也就是说在用到这个实例的时候才会取创建。
饿汉 :饿了之后饥不择食,所以在定义的时候就进行创建。
网友评论