//多线程+加锁(互斥量)
class Singleton2
{
private:
Singleton2();
static Singleton2* m_pInstance2;
static mutex m_mutex;//互斥量
public:
static Singleton2* GetInstance2();
static void DestroyInstance2();
};
Singleton2::Singleton2()
{
cout << "创建单例2" << endl;
}
Singleton2* Singleton2::GetInstance2()
{
if (m_pInstance2 == nullptr)
{
cout << "加锁中" << endl;
m_mutex.lock();
if (m_pInstance2 == nullptr)
{
m_pInstance2 = new Singleton2();
}
cout << "解锁中" << endl;
m_mutex.unlock();
}
return m_pInstance2;
}
void Singleton2::DestroyInstance2()
{
if (m_pInstance2 != nullptr)
{
delete m_pInstance2;
m_pInstance2 = nullptr;
}
}
//静态成员变量的定义
Singleton2* Singleton2::m_pInstance2 = nullptr;//懒汉式的写法
mutex Singleton2::m_mutex;
为什么用static
1.通过静态的类方法(getInstance) 获取instance,该方法是静态方法,instance由该方法返回(被该方法使用),如果instance非静态,无法被getInstance调用;
2.instance需要在调用getInstance时候被初始化,只有static的成员才能在没有创建对象时进行初始化。且类的静态成员在类第一次被使用时初始化后就不会再被初始化,保证了单例。
3.static类型的instance存在静态存储区,每次调用时,都指向的同一个对象。