1 单例模式

来源:互联网 发布:vs2017怎么编写c语言 编辑:程序博客网 时间:2024/06/05 00:32
达内 闵大神
//饿汉单例模式#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;}



 
原创粉丝点击