浅析C++单例模式的实现

单例模式可以说是老生常谈的面试考点。从最经典的单例模式实现开始,我们逐步提供了多种单例模式的实现方式,并一一分析它们的优缺点。

方案一:教科书经典方案

使用一个静态指针管理对象, 当第一次需要时创建此对象。

// 在此略去构造函数等无关代码,仅讨论单例模式本身
class Singleton{
   
public:
    static Singleton& getInstance(){
   
        if(instance_ == nullptr)
            instance_ = new Singleton{
   };
        return *instance_;
    }
private:
	static Singleton* instance_;    
};

显然,这种经典的实现方式存在诸多问题:

  • 仅能单线程下正确运行,多线程时不保证对象唯一。
  • 需要手动释放申请的资源,以防内存泄漏。
  • 每次调用都存在一次判断的开销(几乎无法避免)。

首先,针对多线程正确申请资源这一点,可以使用DCL(Double check lock),即使用一个mutex保护资源的申请过程,并且通过两次判断避免争抢。这就引入了第二个方案。

方案二:DCL

双重锁定检查(DCL)在两次判断中进行一个加锁操作,首先第一次判断,确定了此时对象还未构造,故申请互斥锁并进入临界区完成对象构造。而如果发生争抢,也会被互斥量阻拦,随着构造完成,第二次检查时将发现对象已存在,保证了线程安全。

class Singleton {
   
public:
    static Singl
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值