欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

【C++】单例模式之C++实现

来源:本站整理 作者:佚名 时间:2017-08-17 TAG: 我要投稿

单例模式的概念只允许一个产生一个对象的类
单例模式的实现方法1.单例类保证全局只有唯一一个自行创建的实例对象2.单例类提供获取这个唯一实例的接口
单例模式的优缺点
优点(1)阻止其他度对象实例化自己的副本,保证所有访问唯一性(2)类控制了实例化的过程,所以可以灵活的更改实例化的过程
缺点(1)每次都需要检查是否对象已经生成,造成些微的开销(2)使用单例对象时,开发人员可能会意外发现自己无法实例化该类
单例模式的分类
懒汉模式(适用于各种场景)在需要的时候创建对象懒汉模式需要加入synchronized才可以保证线程安全
饿汉模式(在某些场景下受到限制)在main函数开始的时候即创建对象
饿汉模式是线程安全的
代码实现
懒汉模式的实现
普通版本
class SingleTon
{
public:
    static SingleTon* GetInstance()//获取对象实例的唯一接口
    {
        if (_inst == NULL)
        {
            _inst = new SingleTon;
        }
        return _inst;
    }
 
    void Print()
    {
        cout "SingleTon : "
    }
 
private:
    SingleTon()//防止构造函数创建对象
        :_a(0)
    {}
 
    SingleTon& operator=(const SingleTon&) = delete;
    SingleTon(const SingleTon&) = delete;
 
    int _a;
    static SingleTon* _inst;//指向实例化的指针定义成静态成员
};
 
SingleTon* SingleTon::_inst = NULL;
线程安全版本
加入RAII机制,避免死锁的出现
class SingleTon
{
public:
    static SingleTon* GetInstance()//获取对象实例的唯一接口
    {
        if (NULL == _inst)//只有在创建实例的时候才进行加锁提高效率
        {
            lock_guardlock(_mtx);
            if (_inst == NULL)
            {
                _inst = new SingleTon;
            }
        }
        return _inst;
    }
 
    void Print()
    {
        cout "SingleTon : "
    }
 
private:
    SingleTon()//防止构造函数创建对象
        :_a(0)
    {}
 
    SingleTon& operator=(const SingleTon&) = delete;
    SingleTon(const SingleTon&) = delete;
 
    int _a;
    static SingleTon* _inst;//指向实例化的指针定义成静态成员
    static mutex _mtx;//保证安全的互斥锁
};
 
SingleTon* SingleTon::_inst = NULL;
mutex SingleTon::_mtx;
内存栅栏技术&单例对象的释放
添加双检查机制来提高效率
添加内存栅栏技术来防止由于提升效率而打乱执行的顺序
对单例模式的释放,下面这种方法是有问题的
最好是调用atexit回调机制,在main函数结束完毕后再进行释放
class SingleTon
{
public:
    static SingleTon* GetInstance()//获取对象实例的唯一接口
    {
        if (NULL == _inst)//只有在创建实例的时候才进行加锁提高效率
        {
            lock_guardlock(_mtx);
 
            if (_inst == NULL)
            {
                SingleTon* tmp = new SingleTon;
                MemoryBarrier();//内存栅栏技术
                _inst = tmp;
            }
        }
        return _inst;
    }
 
    void Print()
    {
        cout "SingleTon : "
    }

[1] [2]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载