1.单例模式分类:
- 懒汉单例模式:等到用到的时候创建
- 饿汉单例模式:预先创建好
2.懒汉 + 饿汉单例模式
//懒汉式单例模式缺点,多线程情况下,getSingle函数里面加一个延时1s,单例模式将得到不唯一的指针
namespace Lazy
{
class Single
{
private:
Single()
{
cout << "私有构造函数" << endl;
}
//提供开放的接口
public:
static Single* getSingle();
private:
static Single* Q;
};
Single* Single::Q = nullptr;
Single* Single::getSingle()
{
if (Q == nullptr)
{
Q = new Single;
return Q;
}
return Q;
}
}
namespace Hungry
{
class Single
{
private:
Single()
{
cout << "饿汉单例构造" << endl;
count++;
//sleep(1000);
}
public:
static Single* getSingle()
{
return Q1;
}
private:
static Single* Q1;
static int count;
};
Single* Single::Q1 = new Single;
int Single::count = 0;
}
int main()
{
Lazy::Single* s1 = Lazy::Single::getSingle();
Lazy::Single* s2 = Lazy::Single::getSingle();
Hungry::Single* s3 = Hungry::Single::getSingle();
Hungry::Single* s4 = Hungry::Single::getSingle();
if (s1 == s2)
{
cout << "true" << endl;
}
else
{
cout << "false" << endl;
}
if (s3 == s4)
{
cout << "true" << endl;
}
else
{
cout << "false" << endl;
}
return 0;
}
![](https://img-blog.csdnimg.cn/direct/78cfde5b51da42a58515f216a1880c29.png)
3.多线程懒汉单例模式另一实现思路:临界区资源加锁
static Single* getSingle()
{
if (q == nullptr)
{
cs.Lock();
if (q == nullptr)
{
q = new Single;
}
cs.Unlock();
}
return q;
}