全网整合营销服务商

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

免费咨询热线: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++写一个线程安全的单例模式  # 这是  # 加锁  # 会去  # 不安全  # 是一个  # 饥不择食  # 首次  # 就不  # 老生常谈  # 你说  # 两种  # 万不得已  # 也可  # 这是一个  # 这也  # 也很  # 都很  # 但这  # 只需要  # 可以实现 


相关文章: 建站主机解析:虚拟主机配置与服务器选择指南  建站之星在线客服如何快速接入解答?  香港服务器建站指南:免备案优势与SEO优化技巧全解析  php条件判断怎么写_ifelse和switchcase的使用区别【对比】  如何快速搭建高效服务器建站系统?  制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?  台州网站建设制作公司,浙江手机无犯罪记录证明怎么开?  如何通过NAT技术实现内网高效建站?  建站为何优先选择香港服务器?  网站制作报价单模板图片,小松挖机官方网站报价?  Android自定义listview布局实现上拉加载下拉刷新功能  如何注册花生壳免费域名并搭建个人网站?  建站之星安装后如何自定义网站颜色与字体?  成都品牌网站制作公司,成都营业执照年报网上怎么办理?  建站之星下载版如何获取与安装?  建站之星后台密码遗忘或太弱?如何重置与强化?  如何选择最佳自助建站系统?快速指南解析优劣  Android滚轮选择时间控件使用详解  制作营销网站公司,淘特是干什么用的?  Bpmn 2.0的XML文件怎么画流程图  学校为何禁止电信移动建设网站?  图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?  怎么用手机制作网站链接,dw怎么把手机适应页面变成网页?  *服务器网站为何频现安全漏洞?  如何用好域名打造高点击率的自主建站?  官网网站制作腾讯审核要多久,联想路由器newifi官网  移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?  行程制作网站有哪些,第三方机票电子行程单怎么开?  如何快速生成橙子建站落地页链接?  宁波免费建站如何选择可靠模板与平台?  公司网站制作需要多少钱,找人做公司网站需要多少钱?  网站制作说明怎么写,简述网页设计的流程并说明原因?  山东云建站价格为何差异显著?  西安大型网站制作公司,西安招聘网站最好的是哪个?  jQuery 常见小例汇总  如何在IIS服务器上快速部署高效网站?  建站之星与建站宝盒如何选择最佳方案?  高性价比服务器租赁——企业级配置与24小时运维服务  建站主机选购指南:核心配置优化与品牌推荐方案  如何通过老薛主机一键快速建站?  香港服务器租用每月最低只需15元?  商务网站制作工程师,从哪几个方面把握电子商务网站主页和页面的特色设计?  巅云智能建站系统:可视化拖拽+多端适配+免费模板一键生成  岳西云建站教程与模板下载_一站式快速建站系统操作指南  如何基于云服务器快速搭建个人网站?  如何登录建站主机?访问步骤全解析  建站之家VIP精选网站模板与SEO优化教程整合指南  北京企业网站设计制作公司,北京铁路集团官方网站?  XML的“混合内容”是什么 怎么用DTD或XSD定义  代购小票制作网站有哪些,购物小票的简要说明? 

您的项目需求

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