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

网站建设新闻 常识竞价排名的定义

网站建设新闻 常识,竞价排名的定义,外贸网站推广工作,上海网站建设升级一.定义单例模式是一种创建型设计模式,确保一个类只有一个实例,并提供一个全局访问点特点:1.构造函数和析构函数私有化2.禁用拷贝构造函数和赋值运算符重载(delete)3.利用静态成员函数和静态成员变量来给外界提供访问二…

一.定义

        单例模式是一种创建型设计模式,确保一个类只有一个实例,并提供一个全局访问点

特点:

1.构造函数和析构函数私有化

2.禁用拷贝构造函数和赋值运算符重载(=delete)

3.利用静态成员函数和静态成员变量来给外界提供访问

二.恶汉式

       恶汉是非常霸道的,由此可见,对于恶汉式,我们程序加载时立即创建单例实例(无论是否需要)

代码如下:

//恶汉式:
class Singleton 
{
public://利用静态成员函数和静态成员变量来给外界提供访问static Singleton GetInstance(){return _instance;}	//禁用拷贝构造和赋值运算符Singleton(const Singleton&) =delete;Singleton& operator=(const Singleton&)=delete;
priavte://构造析构私有化:Singleton(){}~Singleton(){}static Singleton _instance;//定义一个对象 
};
//static类外实例化:
Singleton Singleton::_instance;

优点:

  • 线程安全(C++11保证静态变量的线程安全初始化)

  • 程序启动时就创建实例

  • 简单直接

缺点:     

  • 本质是通过空间换来的,可能导致空间浪费

三.懒汉式

        懒汉本质在于懒,说明只有当我们需要时才会创建单例对象,具有延迟实例化特点,通过调用GetInstance()函数来创建对象

优点;

按需创建对象,避免浪费空间

缺点:

基础实现是非线程安全的,需额外处理多线程问题

下面我们一一来讲解不同版本:

//懒汉式:
//初始版本--1
class Singleton
{
public:static Singleton* GetInstance(){if(nullptr==_instance){//创建对象_instance =new Singleton;}return _instance;}//禁用拷贝构造和赋值运算符Singleton(const Singleton&) =delete;Singleton& operator=(const Singleton&)=delete;
priavte://构造析构私有化:Singleton(){}~Singleton(){}static Singleton* _instance;//定义一个对象指针 
};
//类对象实例化: 
Singleton* Singleton::_instance=nullptr;

该版本问题如下:

该代码不是线程、进程安全的,具体是指如果多个线程同时调用到GetInstance中的if语句且都进入,就会new两个以上对象,无法确保只有一个类对象

解决方法:加锁

//懒汉式:
//初始版本--2
#include <mutex>
class Singleton
{
public:static Singleton* GetInstance(){//单检测法: _mutex.lock();if(nullptr==_instance){//创建对象_instance =new Singleton;}_mutex.unlock();return _instance;}//禁用拷贝构造和赋值运算符Singleton(const Singleton&) =delete;Singleton& operator=(const Singleton&)=delete;
priavte://构造析构私有化:Singleton(){}~Singleton(){}static Singleton* _instance;//定义一个对象指针static std::mutex _mutex; 
};
//类对象实例化: 
Singleton* Singleton::_instance=nullptr;
std::mutex Singleton::_mutex;

上面我们利用C++中提供的锁解决了多线程问题,但是如果每次访问都要加锁,并且多线程访问只有一个能够进去,其他要等待,性能非常不好

下面我们来利用双检测法来解决问题:

//懒汉式:
//初始版本--3
#include <mutex>
class Singleton
{
public:static Singleton* GetInstance(){//双检测法: if(nullptr==_instance){_mutex.lock();if(nullptr==_instance){//创建对象 _instance =new Singleton;}_mutex.unlock();}return _instance;}//禁用拷贝构造和赋值运算符Singleton(const Singleton&) =delete;Singleton& operator=(const Singleton&)=delete;
priavte://构造析构私有化:Singleton(){}~Singleton(){}static Singleton* _instance;//定义一个对象指针static std::mutex _mutex; 
};
//类对象实例化: 
Singleton* Singleton::_instance=nullptr;
std::mutex Singleton::_mutex;

该双检测法并非是正确的双检测法,原因:如果CPU执行new的指令发生问题,即如果先返回对象指针,这样就会接受到一个nullptr的指针,出现问题

newCPU执行过程;

1.分配空间 malloc

2.调用构造函数 (类)

3.返回对象指针

下面我们来学习正确的双检测法;

//懒汉式:
//初始版本--4
#include <mutex>
#include <atmoic>
class Singleton
{
public:static Singleton* GetInstance(){//双检测法: (正确写法)Singleton* tmp = _instance.load(std::memory_order_relaxed);//std::memory_order_relaxed---C++11 引入,最宽松的内存顺序约束,仅保证原子性,不提供线程间的同步或顺序保证std::atomic_thread_fence(std::memory_order_acquire); if(nullptr==_instance){_mutex.lock();tmp = _instance.load(std::memory_order_relaxed);if (tmp == nullptr) {tmp = new Singleton();std::atomic_thread_fence(std::memory_order_release);_instance.store(tmp, std::memory_order_relaxed);}_mutex.unlock();}return tmp;}//禁用拷贝构造和赋值运算符Singleton(const Singleton&) =delete;Singleton& operator=(const Singleton&)=delete;
priavte://构造析构私有化:Singleton(){}~Singleton(){}static std::atomic<Singleton*> _instance;;//定义一个对象指针static std::mutex _mutex; 
};
//类对象实例化: 
std::atomic<Singleton*> Singleton::_instance(nullptr);
std::mutex Singleton::_mutex;

利用Atomic来保证原子性,保证双检测不会受到CPU执行指令顺序影响

优点:

线程安全,高性能(只有第一次需要加锁)

缺点:

实现复杂,需要注意内存屏障

最后,我们来学习发明单例模式的作者是如何写的:

//作者实现的: 
class Singleton 
{
public:static Singleton& getInstance() {static Singleton instance;return instance;}Singleton(const Singleton&) = delete;Singleton& operator=(const Singleton&) = delete;private:Singleton() {}~Singleton() {}
};

特点;

线程安全(C++11保证局部静态变量的线程安全初始化)

延迟初始化

简洁高效

不需要考虑内存释放问题

只能说不愧是大佬!!!)

其实我们也可以考虑下智能指针和call_once来实现,大家可以试试

最后,感谢你的浏览,点个关注吧!!!

http://www.dtcms.com/wzjs/236149.html

相关文章:

  • 鞍山发布奶盘seo伪原创工具
  • 海洋cms怎么做电影网站手机百度下载安装
  • 杭州电子商务网站建设英文网站seo
  • 网站制作郑州友情连接
  • 网站优化排名如何做产品营销策划方案
  • 成都市住房与城乡建设局官网桂林seo排名
  • 0元建设黑网站lol今日赛事直播
  • 宜兴做网站的公司有哪些哪个模板建站好
  • 做网站时字幕怎么做精准客户信息一条多少钱
  • 空气炸锅做糕点的网站谷歌sem服务商
  • 企业网站结构图郑州网络seo公司
  • thinkphp5 做网站福州短视频seo服务
  • 有每天做任务赚钱的网站吗搜狗竞价
  • 自己做套现要建网站吗口碑营销方案
  • 北京赛车手机网站建设自媒体人专用网站
  • 青岛专业网站建设公司品牌营销策划ppt
  • 学做网站的笔记本百度联系电话多少
  • 建网站费用会计分录国际形势最新消息
  • 会昌网站seo专业培训课程
  • 苏州外贸公司网站建设流程图怎样创建网站
  • 如何做滴滴网站平台b站推广2024mmm已更新
  • 移动网站建设方案seo快速优化方法
  • 用服务器做网站需要购买域名吗今日新闻摘抄十条
  • 清溪做网站的电话运营培训班有用吗
  • 湖畔魔豆基金会公益网站开发搜索引擎优化到底是优化什么
  • 武汉做网站哪家最好朋友圈软文
  • 电子商务系统的开发方式北京seo顾问推推蛙
  • 做恒生指数看什么网站网络营销战略的内容
  • wordpress怎样下载企业seo职位
  • 做阀门的英文网站怎么写优化网站怎么做