单例模式

来源:互联网 发布:只有我知 编辑:程序博客网 时间:2024/05/16 18:47

单例模式:保证类只有一个实例且类易于外界访问,从而方便对实例个数的控制以及节约系统资源

参加《剑指offer》

#include <iostream>using namespace std;class singleton{      private:              singleton(){};              static singleton* Inst;      public:                  static singleton* getIns(){                     if(NULL == Inst){                        Inst = new singleton();                        printf("this is called\n");                     }                     return Inst;              }};singleton* singleton::Inst = NULL;int main(){    singleton *ins = singleton::getIns();    system("pause");  }

多线程版本1:

#include <iostream>using namespace std;class singleton{      private:              singleton(){};              static singleton* Inst;      public:                  static singleton* getIns(){                     lock();                     if(NULL == Inst){ // 得到锁后,只有当Inst为空时,才会去初始化实例                        Inst = new singleton();                        printf("this is called\n");                     }                     unlock();                     return Inst;              }};singleton* singleton::Inst = NULL;int main(){    singleton *ins = singleton::getIns();    system("pause");  }


由于每个线程去访问都要先获得锁,然后在检查Inst是否为空,在解锁,加锁成本非常高,优化见

多线程版本2:

#include <iostream>using namespace std;class singleton{      private:              singleton(){};              static singleton* Inst;      public:                  static singleton* getIns(){                     if(NULL == Inst){ // 只有Inst是NULL时,线程才会去创建对象的实例,所以加入延迟初始的策略                         lock();                         if(NULL == Inst){                            Inst = new singleton();                            printf("this is called\n");                         }                         unlock();                     }                     return Inst;              }};singleton* singleton::Inst = NULL;int main(){    singleton *ins = singleton::getIns();    system("pause");  }


0 0
原创粉丝点击