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