達內 閔大神
//餓漢單例模式
#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;
}