单例模式

1.饿汉模式

#include<iostream>
using namespace std;

class singleton1{
private:
    static singleton1 s;
    int i;
    singleton1(int x) :i(x){}
    singleton1(const singleton1 &);
    singleton1& operator=(singleton1 &);
public:
    static singleton1& instance(){//static singleton1&
        return s;
    }
    int getValue(){
        return i;
    }
    void setValue(int x){
        i = x;
    }
};

singleton1 singleton1::s(47);//此处不能写static


int main(){
    singleton1& s = singleton1::instance();//&,否则错误
    cout << s.getValue() << endl;

    singleton1& s2 = singleton1::instance();
    s2.setValue(9);

    cout << s.getValue() << endl;
    return 0;
}

2.懒汉模式

#include<iostream>
using namespace std;

class singleton2{
private:
    int i;
    singleton2(int x) :i(x){}
    singleton2(const singleton2&);
    singleton2& operator=(singleton2&);
public:
    static singleton2& instance(){
        static singleton2 s(47);
        return s;
    }
    int getVal(){
        return i;
    }

    void setVal(int x){
        i = x;
    }
};


int main(){

    singleton2& s = singleton2::instance();
    cout << s.getVal() << endl;

    singleton2& s2 = singleton2::instance();
    s2.setVal(9);

    cout << s.getVal() << endl;

    return 0;
}

结果都是
47
9

3.线程安全

#include<iostream>
#include<mutex>
using namespace std;

class Lock{
private:
    mutex* mutexPtr;
public:
    Lock(mutex* pm) : mutexPtr(pm){
        mutexPtr->lock();
    }
    ~Lock(){
        mutexPtr->unlock();
    }
};

class singleton3{
private:
    int i;
    static mutex* m;//static
    static singleton3* pInstance;

    singleton3(int x) :i(x){}
    singleton3(const singleton3&);
    singleton3& operator=(singleton3&);
public:
    static singleton3* instance(){
        if (pInstance == NULL){
            Lock l(m);
            if (pInstance == NULL){
                pInstance = new singleton3(47);
            }
        }
        return pInstance;
    }
    void setVal(int x){
        i = x;
    }
    int getVal(){
        return i;
    }
};

singleton3* singleton3::pInstance = 0;
mutex* singleton3::m = new mutex();

int main(){

    singleton3* s = singleton3::instance();
    cout << s->getVal() << endl; 

    singleton3* s2 = singleton3::instance();
    s->setVal(9);

    cout << s->getVal() << endl;

    return 0;
}

之所以在Instantialize函数里面对pInstance 是否为空做了两次判断,因为该方法调用一次就产生了对象。

pInstance == NULL 大部分情况下都为false,如果按照原来的方法,每次获取实例都需要加锁,效率太低。
而改进的方法只需要在第一次调用的时候加锁,可大大提高效率。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值