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

企业内部网站源码网页制作模板源码

企业内部网站源码,网页制作模板源码,wordpress系统的特点,济南中京网站建设公司单例模式 单例模式确保一个类只有一个实例#xff0c;并提供一个全局访问点。 创建单一实例 怎么让某个类只能创建一个实例#xff1f; 思路#xff1a;将类的构造函数私有#xff0c;然后提供一个静态方法访问对象。调用类内成员函数需要对象#xff0c;但我们又无法…单例模式 单例模式确保一个类只有一个实例并提供一个全局访问点。 创建单一实例 怎么让某个类只能创建一个实例 思路将类的构造函数私有然后提供一个静态方法访问对象。调用类内成员函数需要对象但我们又无法创建出对象所以要将该接口函数声明为静态函数这样就可以在类外使用类名调用。 class Singleton {public:static Singleton* GetInstance() {if (_uniqueInstance nullptr) {_uniqueInstance new Singleton;}return _uniqueInstance;}Singleton(const Singleton) delete;Singleton operator(const Singleton) delete;private:Singleton() default;static Singleton* _uniqueInstance; };Singleton* Singleton::_uniqueInstance nullptr;我们用一个指针保存创建的单例对象并在第一次调用 GetInstance 时创建对象以后就直接返回该单例对象。 多线程下的问题 那么问题来了如果一个线程判断指针为空线程创建单例对象。另一个线程在上一个线程创建返回之前同样进行了判断也得到了指针为空的结果同样进入创建对象。此时一个单例对象竟被创建了两次。我们可以采用加锁的方式让多线程互斥地访问该部分。 class Singleton {public:static Singleton* GetInstance() {_mtx.lock();if (_uniqueInstance nullptr) {_uniqueInstance new Singleton;}_mtx.unlock();return _uniqueInstance;}Singleton(const Singleton) delete;Singleton operator(const Singleton) delete;private:Singleton() default;static Singleton* _uniqueInstance;static mutex _mtx; };Singleton* Singleton::_uniqueInstance nullptr; mutex Singleton::_mtx;此时又有新的麻烦了明明我们只需要在第一次进入时互斥后续访问就不再需要了。采用加锁的方式将大大降低程序的运行效率这在性能要求高的程序中是不可容忍的。 双加锁 一个比较常见的解决方式是双加锁首先检查实例是否已经创建了如果还没创建才进行互斥控制。这样一来就只有第一次会进行互斥控制。 static Singleton* GetInstance() {// 使用 double-check 方式加锁保证效率和线程安全if (_uniqueInstance nullptr) {_mtx.lock();if (_uniqueInstance nullptr) {_uniqueInstance new Singleton;}_mtx.unlock();}return _uniqueInstance; }但实际上上面的代码还是有问题的。问题的来源是 CPU 的乱序执行C 里的 new 包含了两个步骤 调用 ::operator new 分配内存调用构造函数 所以 ptr new T 包含了三个步骤 调用 ::operator new 分配内存在内存的位置上调用构造函数将内存的地址赋值给 ptr 在这三步中2 和 3 的顺序是可以交换的。也就是说有可能有一个线程分配了内存并将地址赋值给 ptr 了但还没有初始化该内存。另一线程检测 ptr 不为空就直接拿去使用了这时可能引起不可预料的结果。 通常情况下可以调用 CPU 提供的一条指令来解决该情况这指令被称为 barrier。一条 barrier 指令会阻止 CPU 将该指令交换到 barrier 之后也不能将之后的指令交换到 barrier 之前。 #define barrier() __asm__ volaticle(lwsync) T* ptr nullptr;T* GetInstance() {if (nullptr ptr) {lock();if (nullptr ptr) {T* tmp new T;barrier();ptr tmp;}unlock();}return ptr; }急切创建实例 如果程序总是创建并使用单例实例或者在创建和运行时方面的负担不太繁重你可以急切创建此单例。 class Singleton {public:static Singleton* GetInstance() {return _instance;}Singleton(const Singleton) delete;Singleton operator(const Singleton) delete;private:Singleton() default;static Singleton _instance; };Singleton Singleton::_instance;如果是 Java上述代码形式没什么问题。JVM 在加载这个类时马上创建此唯一的单例实例。JVM 保证在任何线程访问 uniqueInstance 静态变量之前一定先创建此实例。 non-local static 对象初始化次序问题 但在 C 中还有「不同编译单元内定义的 non-local static 对象」的初始化次序问题。函数内的 static 对象称为 local static 对象其他 static 对象称为 non-local static 对象。 编译单元translation unit是指产出单一目标文件single object file的那些源码。基本上它是单一源码文件加上其所含入的头文件。 如果某编译单元内的某个 non-local static 对象的初始化动作使用了另一编译单元内的某个 non-local static 对象它所用到的这个对象可能尚未被初始化因为 C 对「定义于不同编译单元内的 non-local static 对象」的初始化次序并无明确定义。 幸运的是一个小小的设计便可以解决这个问题。唯一需要做的是将每个 non-local static 对象搬到自己的专属函数内该对象在此函数内被声明为 static。这些函数返回一个 reference 指向它所含的对象。然后用户调用这些函数而不直接指涉这些对象。 这个手法的基础在于C 保证函数呢的 local static 对象会在「该函数被调用期间」「首次遇上该对象的定义式」时被初始化。 class Singleton {public:static Singleton getInstance() {static Singleton inst;return inst;}Singleton(const Singleton) delete;Singleton operator(const Singleton) delete;private:Singleton() default; };
http://www.w-s-a.com/news/139196/

相关文章:

  • 怎样建网站赚钱贵州seo和网络推广
  • 创建网站的工具站内seo优化
  • 网站特效 站长查询网网站
  • 百度移动端网站网站建设设计思想
  • 青岛建设官方网站南宁制作企业网站
  • 校园网站建设管理工作制度大网站开发费用
  • 做logo赚钱的网站分类网站 模板
  • 网站建设完成报告织梦网站怎么做备份
  • 邯郸市城乡建设管理局网站vimwiki wordpress
  • 如何修改wordpress站名如何制作公司网站
  • 宁波网站建设与推广方案网站有了备案号之后能做什么
  • 汕头手机端建站模板pinterest app下载
  • 网站主机免费宁波网站建设优化诊断
  • 吧网站做软件的软件下载简单的ui界面制作
  • 陕西网站制作公司网页制作与设计代码
  • 做网站行情郑州微信网站开发
  • 河间网站建设制作null wordpress theme
  • h5网站制作网站开发网站建设文翻译工作
  • 网站建设 税种秦皇岛哪有网站优化公司
  • 专业开发网站设计找人做网页需要多少钱
  • 手机购物网站 建站网站建设网站制作网站设计
  • 基于iview的网站开发模板小程序制作需要什么语言
  • 精美网站设计保定建行网站首页登录
  • 网站建设常见问题做网站保存什么格式最好
  • 营销型网站建设与网页设计网站建设 amp 找VX cp5173
  • 新网站该如何做网站优化呢儿童手工
  • 湖北现代城市建设集团网站搜索引擎优化的作用
  • 上海做网站吧开一家软件开发公司需要什么
  • 阿里巴巴网站建设改图片建设厅官方网站河南
  • 邓砚谷电子商务网站建设镇江网