网站幕布拍摄,wordpress文章搜索排序,在线设计外卖平台店招,做相册本哪个网站好用文章目录 1、什么是单例2、一个好的单例应该具备的条件3、懒汉模式与饿汉模式4、单例实现#xff1a;线程安全、内存安全的懒汉式单例#xff08;基于C11的智能指针和互斥锁#xff09; 1、什么是单例
单例 Singleton 是设计模式的一种#xff0c;其特点是只提供唯一一个类… 文章目录 1、什么是单例2、一个好的单例应该具备的条件3、懒汉模式与饿汉模式4、单例实现线程安全、内存安全的懒汉式单例基于C11的智能指针和互斥锁 1、什么是单例
单例 Singleton 是设计模式的一种其特点是只提供唯一一个类的实例具有全局变量的特点在任何位置都可以通过接口获取到那个唯一实例。
具体应用场景如 设备管理器。系统中可能有多个设备但是只有一个设备管理器用于管理设备驱动 数据池。用来缓存数据的数据结构需要在一处写多处读取或者多处写多处读取。
2、一个好的单例应该具备的条件
全局只有一个实例static 特性同时禁止用户自己声明并定义实例把构造函数设为 private用户通过接口获取实例使用 static 类成员函数禁止赋值和拷贝线程安全
3、懒汉模式与饿汉模式
懒汉模式 时间换空间故名思义不到万不得已就不会去实例化对象在第一次用到类实例的时候才会去实例化对象多线程情况下会存在线程安全问题需要加互斥锁进行防护。 饿汉模式 空间换时间在单例类定义的时候就进行实例化对象当需要使用时只要通过接口函数直接获取对象。
4、单例实现线程安全、内存安全的懒汉式单例基于C11的智能指针和互斥锁
#include iostream
#include memory
#include mutexclass Singleton {
public:~Singleton() {std::cout destructor called! std::endl;}Singleton(Singleton) delete; // copy constructor cant be calledSingleton operator(const Singleton) delete; // assignment operator cant be calledstatic std::shared_ptrSingleton getInstance() {// 双重锁检测if (m_pInstance nullptr) {std::lock_guardstd::mutex lk(m_mutex);if (m_pInstance nullptr) {m_pInstance std::shared_ptrSingleton(new Singleton);}}return m_pInstance;}private:Singleton() {std::cout constructor called! std::endl;}private:static std::shared_ptrSingleton m_pInstance;static std::mutex m_mutex;
};// initialization static variables out of class
std::shared_ptrSingleton Singleton::m_pInstance nullptr;
std::mutex Singleton::m_mutex;int main() {std::shared_ptrSingleton instance1 Singleton::getInstance();std::shared_ptrSingleton instance2 Singleton::getInstance();return 0;
}运行结果
PS E:\Code\VSCode\Demo\build .E:/Code/VSCode/Demo/build/main.exe
constructor called!
destructor called!基于 shared_ptr用了C比较倡导的 RAII 思想即用对象管理资源。当 shared_ptr 析构的时候new 出来的对象也会被 delete 掉此避免内存泄漏。加了锁使用互斥量来达到线程安全。这里使用了两个 if 判断语句的技术称为双检锁其好处是只有判断指针为空的时候才加锁避免每次调用 get_instance 的方法都加锁毕竟锁的开销还是有点大的。
不足之处在于 使用智能指针会要求用户也得使用智能指针非必要不应该提出这种约束使用锁也有开销并且在某些平台与编译器和指令集架构有关双检锁会失效