当前位置: 首页 > news >正文

漯河网站建设(千弘网络)手机网站app生成

漯河网站建设(千弘网络),手机网站app生成,睢县网站建设,搭配服装网站源码文章目录一、单例模式的概念二、单例模式的结构三、常见实现方式3.1 饿汉式单例3.2 懒汉式单例一、单例模式的概念 单例模式#xff08;Singleton Pattern#xff09;是一种创建型设计模式#xff0c;它的核心思想是#xff1a;保证在一个进程中#xff0c;某个类仅有一个… 文章目录一、单例模式的概念二、单例模式的结构三、常见实现方式3.1 饿汉式单例3.2 懒汉式单例一、单例模式的概念 单例模式Singleton Pattern是一种创建型设计模式它的核心思想是保证在一个进程中某个类仅有一个实例并提供全局访问点。 问题 单例模式同时解决了两个问题 所以违反了单一职责原则 1.保证一个类只有一个实例。 为什么会有人想要控制一个类所拥有的实例数量 最常见的 原因是控制某些共享资源 例如数据库或文件 的访问权限。 它的运作方式是这样的 如果你创建了一个对象 同时过一会儿后你决定再创建一个新对象 此时你会获得之前已创建的对象 而不是一个新对象。 注意 普通构造函数无法实现上述行为 因为构造函数的设计决定了它必须总是返回一个新对象。 客户端甚至可能没有意识到它们一直都在使用同一个对象。 2.为该实例提供一个全局访问节点。 还记得你用过的那些存储重要对象的全局变量吗 它们在使用上十分方便 但同时也非常不安全 因为任何代码都有可能覆盖掉那些变量的内容 从而引发程序崩溃。 和全局变量一样 单例模式也允许在程序的任何地方访问特定对象。 但是它可以保护该实例不被其他代码覆盖。 还有一点 你不会希望解决同一个问题的代码分散在程序各处的。 因此更好的方式是将其放在同一个类中 特别是当其他代码已经依赖这个类时更应该如此。 常见应用场景 日志系统全局唯一的日志记录器。配置管理全局读取配置文件。线程池、数据库连接池全局资源管理。设备驱动对象保证唯一控制入口。 单例模式的关键要素 构造函数私有化防止外部随意 new。拷贝构造与赋值运算符删除防止复制对象。静态成员指针/对象存储唯一实例。公共静态方法提供获取实例的入口。 二、单例模式的结构 所有单例的实现都包含以下两个相同的步骤 将默认构造函数设为私有 防止其他对象使用单例类的 new运算符。新建一个静态构建方法作为构造函数。 该函数会 “偷偷” 调用私有构造函数来创建对象 并将其保存在一个静态成员变量中。 此后所有对于该函数的调用都将返回这一缓存对象。 如果你的代码能够访问单例类 那它就能调用单例类的静态方法。 无论何时调用该方法 它总是会返回相同的对象。 三、常见实现方式 在类中添加一个私有静态成员变量用于保存单例实例。声明一个公有静态构建方法用于获取单例实例。在静态方法中实现延迟初始化。 该方法会在首次被调用时创建一个新对象 并将其存储在静态成员变量中。 此后该方法每次被调用时都返回该实例。将类的构造函数设为私有。 类的静态方法仍能调用构造函数 但是其他对象不能调用。检查客户端代码 将对单例的构造函数的调用替换为对其静态构建方法的调用。 函数内静态变量初始化的线程安全问题 在 C98/03 中 函数内的静态局部变量在第一次调用函数时初始化。多线程调用时如果两个线程同时进入函数就可能同时执行初始化造成多次构造属于竞态条件Race Condition。 所以在 C98/03 里需要手动加锁才能保证安全。 C11 标准明确规定函数内静态局部变量在第一次初始化时初始化过程是线程安全的。 也就是说 即使多个线程同时调用 getInstance()只有一个线程会执行构造函数。其他线程会等待构造完成然后使用同一个实例。 3.1 饿汉式单例 饿汉式的特点 类加载时就创建实例不管你用不用它它都存在。线程安全因为实例在程序开始时就初始化了不存在多线程并发创建的问题。资源消耗如果对象很大而一直没用到会浪费内存。适用场景对象创建成本低且在程序运行中几乎一定会用到。 静态成员对象 #include iostreamclass Singleton { private:Singleton() { std::cout Singleton Created\n; } // 构造函数私有化~Singleton() { std::cout Singleton Destroyed\n; }Singleton(const Singleton) delete; // 禁止拷贝Singleton operator(const Singleton) delete; // 禁止赋值static Singleton instance; // 静态成员类加载时即初始化public:static Singleton getInstance() {return instance; // 返回唯一实例}void show() {std::cout Hello Hungry Singleton! std::endl;} };// 静态成员初始化在程序启动时创建 Singleton Singleton::instance;int main() {Singleton s1 Singleton::getInstance();Singleton s2 Singleton::getInstance();s1.show();std::cout s1 addr s1 , s2 addr s2 std::endl;return 0; }输出结果 实现原理简要 编译器在生成代码时会在静态变量前加上一次性标志guard variable。第一个线程进入函数时检查标志 如果未初始化 → 执行构造函数 → 设置标志如果已初始化 → 直接返回实例 编译器会保证对标志的写入和检查是原子操作或通过内部锁完成从而保证线程安全。 3.2 懒汉式单例 懒汉式的特点 延迟初始化只有第一次调用 getInstance() 时才创建对象。线程安全问题多线程环境下需要注意可能出现多个实例的问题。优点节省资源只有在真正需要时才创建。缺点实现稍复杂需要考虑多线程安全。 懒汉式实现C11 推荐写法 C11 后使用 函数内静态变量 可以保证线程安全 #include iostreamclass Singleton { private:Singleton() { std::cout Singleton Created\n; } // 构造私有~Singleton() { std::cout Singleton Destroyed\n; }Singleton(const Singleton) delete; // 禁止拷贝Singleton operator(const Singleton) delete; // 禁止赋值public:static Singleton getInstance() {static Singleton instance; // 第一次调用时创建C11线程安全return instance;}void show() {std::cout Hello Lazy Singleton! std::endl;} };int main() {Singleton s1 Singleton::getInstance();Singleton s2 Singleton::getInstance();s1.show();std::cout s1 addr s1 , s2 addr s2 std::endl;return 0; }输出结果 懒汉式的多线程安全写法C11 前 如果在 C11 之前需要手动加锁防止多线程同时创建多个实例 #include mutexclass Singleton { private:Singleton() {}Singleton(const Singleton) delete;Singleton operator(const Singleton) delete;static Singleton* instance;static std::mutex mtx;public:static Singleton* getInstance() {if (instance nullptr) {std::lock_guardstd::mutex lock(mtx);if (instance nullptr) {instance new Singleton();}}return instance;} };// 静态成员初始化 Singleton* Singleton::instance nullptr; std::mutex Singleton::mtx;
http://www.pierceye.com/news/948077/

相关文章:

  • 漯河市网站建设在线教育网站建设
  • 便宜网站建设模板网站网站做推广需要营业执照
  • 网站地址栏图标文字企业网站设计公司
  • 公司做网站推广有没有用网址导航被更改了怎么换回来
  • 好看云在线网站模板下载 迅雷下载 迅雷下载地址免费建小程序网站
  • 通州网站制作游戏网站域名
  • 医疗网站前置审批要多长时间营销型外贸网站广州
  • 哈尔滨网站建设oeminc购买手表网站
  • 营销推广公司兰州seo培训
  • 南城网站建设公司php购物网站开发实例源码
  • 无锡网站备案百度应用市场
  • 高端房产网站建设上传空间网站
  • 上海城建建设官方网站中企动力网站价格
  • 网站建设中国十强阜阳网站制作公司多少钱
  • 网站建设公司 温州虚拟机电脑网页版
  • 网站建设原理与实践深建市住房和城乡建设局网站
  • 南通建设招聘信息网站平面设计工作室怎么接单
  • 手机网站开发技巧wordpress网站外包
  • 南昌外贸网站建设宿州做企业网站
  • 专题网站建站给医院做网站赚钱吗
  • 泉州市做网站网站建设培训需要多少钱
  • 网站开发的外文翻译静态网站制作视频
  • 小企业做网站有用吗大气网站首页欣赏
  • 常见的企业网站有哪些苏州网站建设一站通
  • 陕西省高速公路建设集团公司网站外包网站开发 收费
  • 免费做网站刮刮卡腾讯html网页制作软件
  • 网站快照网站反链一般怎么做
  • 山东东营建设网官方网站专做h5的公司网站
  • 电商网站建设题库做海岛旅游类网站的背景及意义
  • 网站开发后台框架wordpress 文章同步微信