线程安全的单例模式

单例模式,保证一个类仅有一个实例,并提供一个访问它们的全局访问点。
而在多线程的环境下,如果多个线程调用getInstance,可能会创建出多个对象,因此需要用互斥量来保护临界区。这里使用了C++11的mutex互斥量,同时使用lock_guard对象,使用RAII的思想保护临界区。

class Singleton
{
public:
    static Singleton* getInstance()
    {
        //先判断实例是否存在,不存在再加锁处理
        if(instance==nullptr)
        {
            lock_guard lock(m_mutex);
            
            //两个线程同时调用getInstance方法同时进入,还是会创建两个实例
            if (instance == nullptr)
            {
                instance = new Singleton;
            }
        }
        return instance;
    }

private:
    //私有函数让其不能被构造,也不能拷贝
    Singleton() {};
    Singleton(const Singleton&) {};
    Singleton& operator = (const Singleton&) {};

    static Singleton *instance;
    static mutex m_mutex;
};
Singleton* Singleton::instance = nullptr;
mutex Singleton::m_mutex;

int main()
{
    Singleton *single1 = Singleton::getInstance();
    Singleton *single2 = Singleton::getInstance();
    if (single1 == single2)
    {
        cout << "=" << endl;
    }
    return 0;
}

你可能感兴趣的:(线程安全的单例模式)