题目: 手撕单例模式
思路:
- 构造函数私有化
- 一个静态成员变量,私有的,
- 一个公有的成员函数,在函数内创建实例
- 初始化类中静态成员变量
懒汉式Singleton实现如下:
class Singleton {
private:
Singleton() {
cout << "Singleton 构造函数执行" << endl;
}
public:
static Singleton* getInstance() {
if (mPtr == nullptr) {
if (mPtr == nullptr)
mPtr = new Singleton;
}
return mPtr;
}
private:
static Singleton* mPtr;
};
Singleton* Singleton::mPtr = nullptr;
为了解决上面的懒汉式单例模式出现的多线程问题 (当多个线程同时执行Singleton* p1 = Singleton::getInstance(); 会出现问题)
请加上互斥锁,给出优化解法
class Singleton {
private:
Singleton() {
cout << "Singleton 构造函数执行" << endl;
}
public:
static Singleton* getInstance() {
if (mPtr == nullptr) {
mux.lock(); // 解决多线程安全问题
if (mPtr == nullptr) {
mPtr = new Singleton;
}
mux.unlock();
}
return mPtr;
}
static Singleton* freeInstance() {
if (mPtr != nullptr) {
delete mPtr;
mPtr = nullptr;
}
return mPtr;
}
private:
static Singleton* mPtr;
};
Singleton* Singleton::mPtr = nullptr;
下面把饿汉式单例模式(不存在线程安全问题)也写一下吧:
class Singleton {
private:
Singleton() {
cout << "Singleton 构造函数执行" << endl;
}
public:
static Singleton* getInstance() {
return mPtr;
}
static Singleton* freeInstance() {
if (mPtr != nullptr) {
delete mPtr;
mPtr = nullptr;
}
return mPtr;
}
private:
static Singleton* mPtr;
};
Singleton* Singleton::mPtr = new Singleton();