全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

老生常谈C++的单例模式与线程安全单例模式(懒汉/饿汉)

1 教科书里的单例模式

我们都很清楚一个简单的单例模式该怎样去实现:构造函数声明为private或protect防止被外部函数实例化,内部保存一个private static的类指针保存唯一的实例,实例的动作由一个public的类方法代劳,该方法也返回单例类唯一的实例。

上代码: 

class singleton
{
protected:
  singleton(){}
private:
  static singleton* p;
public:
  static singleton* instance();
};
singleton* singleton::p = NULL;
singleton* singleton::instance()
{
  if (p == NULL)
    p = new singleton();
  return p;
}

这是一个很棒的实现,简单易懂。但这是一个完美的实现吗?不!该方法是线程不安全的,考虑两个线程同时首次调用instance方法且同时检测到p是NULL值,则两个线程会同时构造一个实例给p,这是严重的错误!同时,这也不是单例的唯一实现!

2 懒汉与饿汉

单例大约有两种实现方法:懒汉与饿汉。

懒汉:故名思义,不到万不得已就不会去实例化类,也就是说在第一次用到类实例的时候才会去实例化,所以上边的经典方法被归为懒汉实现;

饿汉:饿了肯定要饥不择食。所以在单例类定义的时候就进行实例化。

特点与选择:

由于要进行线程同步,所以在访问量比较大,或者可能访问的线程比较多时,采用饿汉实现,可以实现更好的性能。这是以空间换时间。

在访问量较小时,采用懒汉实现。这是以时间换空间。

3 线程安全的懒汉实现

线程不安全,怎么办呢?最直观的方法:加锁。

方法1:加锁的经典懒汉实现:

class singleton
{
protected:
  singleton()
  {
    pthread_mutex_init(&mutex);
  }
private:
  static singleton* p;
public:
  static pthread_mutex_t mutex;
  static singleton* initance();
};

pthread_mutex_t singleton::mutex;
singleton* singleton::p = NULL;
singleton* singleton::initance()
{
  if (p == NULL)
  {
    pthread_mutex_lock(&mutex);
    if (p == NULL)
      p = new singleton();
    pthread_mutex_unlock(&mutex);
  }
  return p;
}

方法2:内部静态变量的懒汉实现

此方法也很容易实现,在instance函数里定义一个静态的实例,也可以保证拥有唯一实例,在返回时只需要返回其指针就可以了。推荐这种实现方法,真得非常简单。

class singleton
{
protected:
  singleton()
  {
    pthread_mutex_init(&mutex);
  }
public:
  static pthread_mutex_t mutex;
  static singleton* initance();
  int a;
};

pthread_mutex_t singleton::mutex;
singleton* singleton::initance()
{
  pthread_mutex_lock(&mutex);
  static singleton obj;
  pthread_mutex_unlock(&mutex);
  return &obj;
}

4 饿汉实现

为什么我不讲“线程安全的饿汉实现”?因为饿汉实现本来就是线程安全的,不用加锁。为啥?自己想!

class singleton
{
protected:
  singleton()
  {}
private:
  static singleton* p;
public:
  static singleton* initance();
};
singleton* singleton::p = new singleton;
singleton* singleton::initance()
{
  return p;
}

是不是特别简单呢?

以空间换时间,你说简单不简单?

面试的时候,线程安全的单例模式怎么写?肯定怎么简单怎么写呀!饿汉模式反而最懒[正经脸]! 

以上就是小编为大家带来的老生常谈C++的单例模式与线程安全单例模式(懒汉/饿汉)全部内容了,希望大家多多支持~


# 单例模式  # 懒汉  # 饿汉式  # 详解C++实现线程安全的单例模式  # C++线程安全的单例模式讲解  # 从C++单例模式到线程安全详解  # 详解如何使用C++写一个线程安全的单例模式  # 这是  # 加锁  # 会去  # 不安全  # 是一个  # 饥不择食  # 首次  # 就不  # 老生常谈  # 你说  # 两种  # 万不得已  # 也可  # 这是一个  # 这也  # 也很  # 都很  # 但这  # 只需要  # 可以实现 


相关文章: 西安制作网站公司有哪些,西安货运司机用的最多的app或者网站是什么?  如何通过FTP服务器快速搭建网站?  如何在服务器上三步完成建站并提升流量?  枣阳网站制作,阳新火车站打的到仙岛湖多少钱?  如何配置IIS站点权限与局域网访问?  上海网站制作网页,上海本地的生活网站有哪些?最好包括生活的各个方面的?  如何在云主机快速搭建网站站点?  如何彻底卸载建站之星软件?  如何选择最佳自助建站系统?快速指南解析优劣  网站制作多少钱一个,建一个论坛网站大约需要多少钱?  深圳企业网站制作设计,在深圳如何网上全流程注册公司?  如何快速查询网站的真实建站时间?  安云自助建站系统如何快速提升SEO排名?  洛阳网站制作公司有哪些,洛阳的招聘网站都有哪些?  官网建站费用明细查询_企业建站套餐价格及收费标准指南  建站之星会员如何解锁更多建站功能?  弹幕视频网站制作教程下载,弹幕视频网站是什么意思?  如何选择高效便捷的WAP商城建站系统?  如何通过商城自助建站源码实现零基础高效建站?  网站制作说明怎么写,简述网页设计的流程并说明原因?  网站制作软件免费下载安装,有哪些免费下载的软件网站?  小建面朝正北,A点实际方位是否存在偏差?  利用JavaScript实现拖拽改变元素大小  香港服务器网站推广:SEO优化与外贸独立站搭建策略  制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?  php8.4新语法match怎么用_php8.4match表达式替代switch【方法】  建站主机SSH密钥生成步骤及常见问题解答?  如何获取开源自助建站系统免费下载链接?  网站制作的软件有哪些,制作微信公众号除了秀米还有哪些比较好用的平台?  阿里云高弹*务器配置方案|支持分布式架构与多节点部署  网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?  湖南网站制作公司,湖南上善若水科技有限公司做什么的?  大连网站制作公司哪家好一点,大连买房网站哪个好?  简单实现Android验证码  建站168自助建站系统:快速模板定制与SEO优化指南  如何通过网站建站时间优化SEO与用户体验?  建站之星如何快速更换网站模板?  浙江网站制作公司有哪些,浙江栢塑信息技术有限公司定制网站做的怎么样?  如何在宝塔面板创建新站点?  ,怎么用自己头像做动态表情包?  *服务器网站为何频现安全漏洞?  金*站制作公司有哪些,金华教育集团官网?  c# Task.Yield 的作用是什么 它和Task.Delay(1)有区别吗  黑客入侵网站服务器的常见手法有哪些?  如何通过虚拟机搭建网站?详细步骤解析  佛山企业网站制作公司有哪些,沟通100网上服务官网?  头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?  济南网站建设制作公司,室内设计网站一般都有哪些功能?  长春网站建设制作公司,长春的网络公司怎么样主要是能做网站的?  专业网站制作服务公司,有哪些网站可以免费发布招聘信息? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。