1.释放单例模式中的对象问题
2.单例模式中多线程时数据共享问题
#include <iostream> #include<thread> #include<string> #include<vector> #include<algorithm> #include<windows.h> #include<list> #include<mutex> using namespace std; static std::mutex mut; class MyClass { public: static MyClass *GetInstance() { if (m_instance == NULL) //双重锁定 { std::unique_lock<std::mutex> myMutex(mut); if (m_instance == NULL) { m_instance = new MyClass(); static GCMyClass gc; } } return m_instance; } class GCMyClass //类中嵌套类,用来释放对象 { public: ~GCMyClass() { if (MyClass::m_instance != NULL) { delete MyClass::m_instance; MyClass::m_instance = NULL; } } private: }; private: static MyClass *m_instance; }; MyClass *MyClass::m_instance = NULL; int main() { MyClass *pMyClass = MyClass::GetInstance(); system("pause"); }
解释:
1.为了释放单例模式中的对象(m_instance),巧妙的使用了类中嵌套类的方式来释放。
2.多线程中使用单例模式的话,对m_instance不加锁的话,可能会出现多次对m_instance进行new()开辟空间,所以必须加锁。锁外部使用if (m_instance == NULL)的作用是为了提高程序的效率,因为如果不加这句,代码中每次调用GetInstance()这个方法都会加锁,但其实只是MyClass类第一次实例化的时候需要加锁,后面的话就不需要加锁。