实战设计模式系列-Singleton(单件)

本文介绍了单例模式的基本概念及其在资源管理和日志记录等场景的应用。通过对比两种不同的实现方式,详细分析了线程安全性和静态变量初始化顺序等问题,并提供了一种改进方案。

【引言】

 

    单件模式的应用场景大家都不陌生,目的也很明确,就是一个类保证只有一个实际,比如项目中的资源管理器,或打log的类,都比较适合单件模式,话不多说,先贴一段代码吧。

 

 

 

 

    

    上面的实现是GOF中的标准实现,但是这种方案有些问题,如下所示:

 

    1. 不是线程安全的,如果两个线程A、B,A先调用if(_instance==0),这里判断结果是单件未实例化,这时cpu被B抢占,B也执行到同一行,判断结果也是未实例化,那么继续执行,_instance就会被实例化两次。

 

    2. 在全局变量或静态变量中调用单件模式的接口,比如上面的单件有个接口是int GetId(); 那可以定义一个全局的ID,如下所示: int g_Id = Singleton::Instance()->GetId(); 这时全量变量g_Id和静态变量_instance之间就存在一个初始化先后的问题,而C++并未对这类非局部静态变量初始化顺序做说明。

 

    针对上面的问题,给出一种改进的实现。

 

    【改进方案】

 

    下面的实现是采用静态局部变量的方案,保证在进程的生命周期中只实例化一次,如下所示:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值