6. 单件模式

     单件模式的特点很鲜明,确保在整个系统中只能实例化一个对象,并提供全局访问点。并且在下面的写法(1)和(3)中是在使用的时候才去创建对象,“延时实例化”,对于很占内存的对象来讲是有利的。当然在使用它的时候要考虑多线程的问题。
     总结起来有三种写法:
(1)加锁,因为加了lock,只能有一个线程获取到这个lock,其他的线程只能等待。所以在对性能要求不高的时候可以使用。 
class Singleton
{
private:
     static Singleton *uniqueSingleton;
public:
     static Singleton GetInstance()
     {
          Lock lock;
          if(uniqueSingleton == NULL)
                uniqueSingleton = new Singleton();
          return uniqueSingleton;
     }
};
(2)在初始化对象时,先创建singleton对象。这样就避免了多线程带来的问题。只是不能延时创建对象。 
class Singleton
{
private:
     static Singleton *uniqueSingleton = new Singleton();
public:
     static Singleton GetInstance()
     {
          return uniqueSingleton;
     }
};
(3)双检查锁+volatile, 注意要防止双检查锁失效 
class Singleton
{
private:
     static volatile Singleton *uniqueSingleton;
public:
     static Singleton GetInstance()
     {
          if(uniqueSingleton == NULL)
          {
               Lock lock;
               if(uniqueSingleton == NULL)
                     uniqueSingleton = new Singleton();
          }
          return uniqueSingleton;
     }
};

参考文献:
http://blog.jobbole.com/52164/


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值