单线程版本
template<typename T>
class Singleton {
public:
T &getInstance() {
if (value_ == nullptr) {
//判断语句
vaule_ = new T();
}
return *value_;
}
private:
Singleton();
~Singleton();
static T *value_;
};
这个版本只适合单线程使用, 因为如果在多线程环境下可能两个线程同时执行到上面的判断语句, 进而同时进入if
为真的分支,最后两个线程产生了各自的实例, 这就破坏了单例的定义。
改进:多线程版本
template<typename T>
class Singleton {
public:
T &getInstance() {
MutexLock lock(mutex_); //RAII
if (value_ == nullptr) {
value_ = new T();
}
return *value_;
}
private:
Singleton();
~Singleton();
Mutex mutex_;
static T *value_;
}
既然在判断语句这里存在竞争, 那就直接加锁好了, 这样的处理方法总是正确的, 但是效率确实堪忧的, 因为所有的