单线程
#include <iostream>
using namespace std;
class Singleton
{
public:
static Singleton* getInstance()
{
if (!m_pobjSingleton)
{
m_pobjSingleton = new Singleton();
}
return m_pobjSingleton;
}
void show(const int& number)
{
cout << "i am singleton number " << number << ' ' << this << endl;
}
private:
Singleton() {}
static Singleton* m_pobjSingleton;
};
Singleton* Singleton::m_pobjSingleton = nullptr;
int main()
{
for (int i = 0; i < 50; ++i)
{
Singleton::getInstance()->show(i);
}
return 0;
}
多线程
#include <iostream>
#include <thread>
#include <vector>
#include <mutex>
using namespace std;
class Singleton
{
public:
static Singleton* getInstance(const int& number)
{
unique_lock<mutex> lck(m_mutex);
if (!m_pobjSingleton)
{
m_pobjSingleton = new Singleton();
}
m_pobjSingleton->show(number);
return m_pobjSingleton;
}
private:
void show(const int& number)
{
cout << "i am singleton number " << number << ' ' << this << endl;
}
Singleton() {}
static Singleton* m_pobjSingleton;
static mutex m_mutex;
};
Singleton* Singleton::m_pobjSingleton = nullptr;
mutex Singleton::m_mutex;
int main()
{
vector<thread> vecThread(50);
for (int i = 0; i < 50; ++i)
{
vecThread[i] = thread(Singleton::getInstance, i);
}
for (auto& it : vecThread)
{
it.join();
}
return 0;
}
总结:单线程用的单例模式已经够很多情况下使用,只是这种情况下多线程访问的时候还是会可能会生成多个实例,加上锁在多线程情况下就只会生成一个实例,保证内存中只有一个实例。