zoukankan      html  css  js  c++  java
  • 单例模式

    //饿汉模式:即类产生的时候就创建好实例对象,这是一种空间换时间的方式
    class CSingleton
    {
    public:
        ~CSingleton() {};
        CSingleton(const CSingleton&);
        CSingleton& operator=(const CSingleton&);
        static CSingleton& GetInstance()
        {        
            return instance;
        }
    private:
        CSingleton() {};
        static CSingleton instance;
    };
    
    //懒汉模式:即在需要的时候,才创建对象,这是一种时间换空间的方式
    class CSingleton
    {
    public:
        ~CSingleton(){};
        CSingleton(const CSingleton&);
        CSingleton& operator=(const CSingleton&);
        static CSingleton& GetInstance()
        {
            static CSingleton instance;
            return instance;
        }
    private:
        CSingleton(){};
    
    };
    
    //双层锁的方式
    class CSingleton
    {
    public:
        ~CSingleton() {};
        static CSingleton* GetInstance()
        {
            if (m_pInstance == nullptr)
            {
                std::lock_guard<std::mutex> lck(m_mutex);
                if (m_pInstance == nullptr)
                {
                    m_pInstance = new CSingleton;   //内存存在泄漏,可替换智能指针方式
                }
                return m_pInstance;
            }
        }
    private:
        CSingleton() {};
        static CSingleton* m_pInstance;
        static std::mutex m_mutex;
    };
    
    //智能指针方式
    class CSingleton
    {
    public:
        ~CSingleton() {};    //注意智能指针shared_ptr无法访问私有化的析构函数,若析构函数定义为private,则在单例类内部再定义一个静态的Destory函数,在定义share_ptr的时候指定删除器为destroy
        static std::shared_ptr<CSingleton> GetInstance()
        {
            if (m_pInstance == nullptr)
            {
                std::lock_guard<std::mutex> lck(m_mutex);
                if (m_pInstance == nullptr)
                {
                    m_pInstance = std::shared_ptr<CSingleton>(new CSingleton);
                }
                return m_pInstance;
            }
        }
    private:
        CSingleton() {};
        static std::shared_ptr<CSingleton> m_pInstance;
        static std::mutex m_mutex;
    };
  • 相关阅读:
    程序执行并发和并行的理解
    计算机的线程和进程的区别理解,不是编程上的进程和线程
    php单线程理解
    一句话题解(2020.12)
    PE328 Lowest-cost Search
    arc109D
    6908. 【2020.11.30提高组模拟】关灯(light)/loj#3385. 「COCI 2020.11」Svjetlo
    CF1456D. Cakes for Clones
    CF1456C. New Game Plus!
    agc025E
  • 原文地址:https://www.cnblogs.com/yapp/p/14307174.html
Copyright © 2011-2022 走看看