C++实现一个单例模式(懒汉与饿汉)

来源:互联网 发布:淘宝印度大麻种子 编辑:程序博客网 时间:2024/06/05 06:10

单例模式的特点:
1、一个类只能有一个实例。
2、一个类必须自己创建自己的唯一实例。
3、一个类必须给所有其他对象提供这一实例。

单例模式的实现:
1、将构造函数声明为private防止被外部函数实例化;
2、包含一个静态私有类指针sig和静态公有方法instance();
3、instance方法负责检验并实例化自己,然后存储在静态类指针sig中,以确保只有一个实例被创建。

参考代码

class singleton{    //构造函数声明为私有的private:    singleton()    {}    //静态私有类指针private:    static singleton *sig;    //静态公有方法public:    static singleton* instance()    {        if (sig == NULL)            sig = new singleton();        return sig;    }};

如上方法是线程不安全的,如果两个线程同时首次调用instance方法且同时检测到p是NULL值,则两个线程会同时构造一个实例给p,这样是错误的。

饿汉模式与懒汉模式

懒汉:在第一次用到类实例的时候才会去实例化,所以上边的方法被归为懒汉实现。

饿汉:饿了肯定要饥不择食。所以在单例类定义的时候就进行实例化。

优缺点:

访问量比较大,或者可能访问的线程比较多时,采用饿汉实现,以空间换时间。
访问量较小时,采用懒汉实现。以时间换空间。

线程安全的懒汉实现:

1、加锁

class singleton{private:    singleton()    {    pthread_mutex_init(&lock);    }private:    static singleton *sig;    static pthread_mutex_t lock;public:    static singleton* instance()    {        if (sig == NULL)       {        pthread_mutex_lock(&lock);        if (sig == NULL)            sig = new singleton();        pthread_mutex_unlock(&lock);        }        return sig;    }};

2、内部静态变量

class singleton{private:    singleton()    {    pthread_mutex_init(&lock);    }public:    static pthread_mutex_t lock;    int p;public:    static singleton* instance()    {        pthread_mutex_lock(&lock);        static singleton sig;        pthread_mutex_unlock(&lock);        }        return &sig;    }};

饿汉的实现
在instance函数里定义一个静态的实例,也可以保证拥有唯一实例,在返回时只需要返回其指针.

饿汉本身就是安全的。

class singleton{protected:    singleton()    {}private:    static singleton *sig;public:    static pthread_mutex_t lock;public:    sig=new singleton;    static singleton* instance()    {        return sig;    }};