线程安全的singleton

#ifndef _SINGLETON_H_
#define _SINGLETON_H_
#include "MultiThread.h"

class singleton
{
public:
    ~singleton()
    {

    }
    static singleton* getInstance()
    {
        MutexLockGuard lock(mutex_);
        if(NULL == instance_)
        {
            instance_ = new singleton();
        }
        return instance_;
    }
private:
    singleton()
    {

    }
    static singleton* instance_;
    Mutex mutex_;
};

singleton* singleton::instance_ = NULL;
#endif //_SINGLETON_H_

上面解法不是很完美,每次getInstance都会加锁,二加锁是一个非常耗时的操作,在没有必要时应尽量避免。

我们只是在实例还没有创建之前需要加锁操作,以保证只有一个线程创建出实例。而当实例已经创建成功,我们已经

不需要再做加锁操作了,读是线程安全的。上述代码修改如下:

#ifndef _SINGLETON_H_
#define _SINGLETON_H_
#include "MultiThread.h"

class singleton
{
public:
    ~singleton()
    {

    }
    static singleton* getInstance()
    {
        if(NULL == instance_)
        {
            MutexLockGuard lock(mutex_);//作用域为临界区
            if(NULL == instance_)
            {
                instance_ = new singleton();
            }
        }
        return instance_;
    }
private:
    singleton()
    {

    }
    static singleton* instance_;
    Mutex mutex_;
};

singleton* singleton::instance_ = NULL;
#endif //_SINGLETON_H_


你可能感兴趣的:(设计模式,多线程,Singleton,线程安全)