达内 闵大神
//饿汉单例模式
#include <iostream>
using namespace std;
class Singleton
{
public:
static Singleton& getInstance()
{
return s_instance;
}
private:
Singleton(){}
Singleton(const Singleton& that){}
static Singleton s_instance;//静态成员变量
};
Singleton Singleton::s_instance;
int main()
{
Singleton& s1 = Singleton::getInstance();
Singleton& s2 = Singleton::getInstance();
Singleton& s3 = Singleton::getInstance();
cout<<&s1<<' '<<&s2<<' '<<&s3<<endl;
return 0;
}
//懒汉单例模式
#include <iostream>
using namespace std;
class Singleton
{
public:
static Singleton& getInstance()
{
if(!s_instance)
s_instance = new Singleton;
return *s_instance;
}
private:
Singleton(){}
Singleton(const Singleton& that){}
static Singleton* s_instance;//静态成员变量
};
Singleton* Singleton::s_instance = NULL;
int main()
{
Singleton& s1 = Singleton::getInstance();
Singleton& s2 = Singleton::getInstance();
Singleton& s3 = Singleton::getInstance();
cout<<&s1<<' '<<&s2<<' '<<&s3<<endl;
return 0;
}
//懒汉单例模式 考虑引用计数,考虑线程安全
#include <iostream>
using namespace std;
class Singleton
{
public:
static Singleton& getInstance()
{
if(!s_instance)//减少不必要的加锁,提高程序性能
{
pthread_mutex_lock(&s_mutex);
if(!s_instance)
s_instance = new Singleton;
pthread_mutex_unlock(&s_mutex);
}
++s_counter;
return *s_instance;
}
void releaseInstance()
{
if(s_counter && --s_counter == 0)//0的时候不能再减小避免减到不合理的值
{
cout<<"析构 被执行"<<endl;
delete this;
}
}
private:
Singleton()
{
cout<<"构造被执行"<<endl;
}
Singleton(const Singleton& that){}
~Singleton()
{
s_instance = NULL;//避免野指针
}
static Singleton* s_instance;//静态成员变量
static int s_counter;
static pthread_mutex_t s_mutex;
};
Singleton* Singleton::s_instance = NULL;
int Singleton::s_counter = 0;
pthread_mutex_t Singleton::s_mutex = PTHREAD_MUTEX_INITIALIZER;
int main()
{
Singleton& s1 = Singleton::getInstance();
Singleton& s2 = Singleton::getInstance();
Singleton& s3 = Singleton::getInstance();
cout<<&s1<<' '<<&s2<<' '<<&s3<<endl;
s1.releaseInstance();
s2.releaseInstance();
s3.releaseInstance();
return 0;
}