本文主要总结几种单例实现的方式,实现单例时需要主要考虑线程安全。再者可以考虑泛型单例模式的实现,可以传入不同个数的参数和不同类型的参数来构造单例。
双重校验加锁
为了线程安全都会考虑到上锁。同时为了提高效率一般会使用双重校验加锁的方式,如下示例代码:
#include <mutex>
#include <memory>
template<typename T>
class Singleton {
public:
static T* GetInstance() {
static std::mutex m_mutex;
if (nullptr == m_instance_) {
std::lock_guard<std::mutex> lock(m_mutex);
if (nullptr == m_instance_) {
m_instance_=std::make_shared<T>();
}
}
return m_instance_.get();
}
private:
static std::shared_ptr<T> m_instance_;
};
template<typename T