单例模式

单例模式:

单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。


#include <iostream>
using namespace std;

class singleton{
      private:
              singleton(){};
              static singleton* Inst;
      public:    
              static singleton* getIns(){
                     if(NULL == Inst){  // 不适合多进程,如果某个线程在还未执行Inst = new singleton()时候,另外一个线程已经进来了,此时Inst还是NULL,就不能保证只有一个实例了
                          Inst = new singleton();
                          printf("this is called\n");
                     }
                     return Inst;
              }
};

singleton* singleton::Inst = NULL;

int main(){
    singleton *ins = singleton::getIns();
    system("pause");  
}

多线程版本1:参加《剑指offer》

#include <iostream>
using namespace std;

class singleton{
      private:
              singleton(){};
              static singleton* Inst;
      public:    
              static singleton* getIns(){
                          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");  
}

由于每次都加锁,使用锁的成本很高,只有在当前实例为空时才会去加锁,所以有了多线程版本2:

#include <iostream>
using namespace std;

class singleton{
      private:
              singleton(){};
              static singleton* Inst;
      public:    
              static singleton* getIns(){
                     if(NULL == Inst){ // 只有当实例为空时,才会去创建实例,别的线程已经创建完成时,那么直接返回即可/*也有成为延迟初始策略*/
                          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");  
}


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值