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小时内与您取得联系。