关注
 //懒汉模式:lazy load  只有用了才加载  复杂场景下也可以使用
namespace LAZY
{
    class Lock
    {
    public:
        Lock(mutex& mux) :_mux(mux){
            //_mux.lock();
        }
        ~Lock(){
            //_mux.unlock();
        }
        //防拷贝
    protected:
        Lock(const Lock& mx);
        Lock& operator=(const Lock& mx);
    private:
        mutex& _mux;
    };
    class Singleton
    {
    public:
        //判断是否为空,如果为空则创建,不为空就直接返回
        static Singleton* GetInstance()
        {
            //加锁线程安全,如果中间返回了会造成死锁  所以自己写了一个
            //mu.lock();
            lock_guard<mutex> lock(mu);
            // 双检查
            if (_ints == NULL)
            {
                Lock lock(mu);
                if (_ints == NULL)
                {           
                    Singleton* tmp = new Singleton;
                    //内存栅栏  栅栏之后和之前的语句不能被打乱 防止编译器对程序进行优化
                    MemoryBarrier();
                    _ints = tmp;
                }
            }
            //mu.unlock();
            return _ints;
        }
        //销毁单例模式
        static void DelInstance()
        {
            lock_guard<mutex> lock(mu);
            if (_ints)
            {
                cout << "test if delete" << endl;
                delete _ints;
                _ints = NULL;
            }
        }
        //防拷贝,只声明不实现
        Singleton(const Singleton&);
        Singleton& operator=(const Singleton&);
        void Print()
        {
            cout << "Singleton:" << _a << endl;
        }
    private:
        //将构造函数声明为私有
        Singleton() :_a(0)
        {}
        int _a;
        static mutex mu;
        static Singleton* _ints;
    };
    Singleton* Singleton::_ints = NULL;
    mutex Singleton::mu;
    void test()
    {
        Singleton::GetInstance()->Print();
        //如果在此之后还有人创建单例怎么办??所以最好不要手动释放
        //Singleton::DelInstance();
        atexit(Singleton::DelInstance);
    }
}
//饿汉模式:程序运行就创建  简洁,适用性会受到限制  
namespace HUNGRY
{
    class Singleton
    {
    public:
        static Singleton& GetInstance()
        {
            static Singleton inst;//进来第一次创建  后面进来不再创建,直接返回
            return inst;
        }
        void Print()
        {
            cout << "Singleton:" << _a << endl;
        }
    protected:
        Singleton() :_a(0)
        {}
        Singleton(const Singleton&);
        Singleton& operator=(const Singleton&);
        int _a;
    };
    void test1()
    {
        Singleton::GetInstance().Print();
    }
}
int main()
{
    //HUNGRY::test1();
    LAZY::test();
    system("pause");
    return 0;
}
  查看原帖
  点赞  评论
相关推荐
 点赞 评论 收藏   
分享
 牛客热帖
更多 
 正在热议
 更多 
 # 我是面试官,请用一句话让我破防 #
 17139次浏览 106人参与
# 美团开奖 #
 185672次浏览 980人参与
# “vivo”个offer #
 33514次浏览 247人参与
# 校招生月薪1W算什么水平 #
 17234次浏览 117人参与
# 中美关税战对我们有哪些影响 #
 38468次浏览 319人参与
# i人适合做什么工作 #
 8204次浏览 82人参与
# 快手技术岗信息交流阵地 #
 15897次浏览 82人参与
# 读研or工作,哪个性价比更高? #
 75495次浏览 764人参与
# 华为保温 #
 102878次浏览 386人参与
# 哪些瞬间让你真切感受到了工作的乐趣 #
 17370次浏览 79人参与
# 小厂实习有必要去吗 #
 70104次浏览 346人参与
# 哪些行业值得去? #
 3119次浏览 41人参与
# 秋招什么时候开投比较合适? #
 109972次浏览 807人参与
# 如果秋招能重来,我会____ #
 30266次浏览 256人参与
# 华为池子有多大 #
 107764次浏览 750人参与
# 美团求职进展汇总 #
 2807136次浏览 23841人参与
# 上班后和你想的一样吗? #
 87601次浏览 666人参与
# 苦尽甘来时,再讲来时路 #
 26870次浏览 367人参与
# 为了实习逃课值吗? #
 23715次浏览 220人参与
# 大家实习每天都在干啥 #
 97279次浏览 536人参与
# 工作压力大怎么缓解 #
 119813次浏览 1112人参与
# 如果上班像打游戏,你最想解锁什么技能 #
 5845次浏览 56人参与
 小鹏汽车工作强度 25人发布
小鹏汽车工作强度 25人发布