线程安全的单例模式

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

class Singleton
{
public:
    static Singleton* getInstance()
    {
        //先判断实例是否存在,不存在再加锁处理
        if(instance==nullptr)
        {
            lock_guard<mutex> 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;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容