单例模式(Singleton),保证一个类仅有一个实例,并提供一个访问它的全局访问点。其构造过程由自身完成,可以将构造方法定义为private型的,这样外界就只能通过定义的静态的函数Instance()构造实例,这个函数的目的就是返回一个类的实例,在此方法中去做是否有实例化的判断。客户端不再考虑是否需要去实例化的问题,把这些都交给了单例类自身。通常我们可以让一个全局变量使得一个对象被访问,但它不能防止你实例化多个对象。一个最好的办法,就是让类自身负责保存它的唯一实例。这个类可以保证没有其他实例可以被创建,并且它可以提供一个访问该实例的方法。

C++版本:
template <class T>
class Singleton
{
public:
static inline T* Instance();
static inline void ReleaseInstance();
private:
Singleton(void){}
~Singleton(void){}
Singleton(const Singleton&){}
Singleton & operator= (const Singleton &){}
static std::auto_ptr<T> m_instance;
static ThreadSection m_critSection;
};
template <class T>
std::auto_ptr<T> Singleton<T>::m_instance;
template <class T>
ThreadSection Singleton<T>::m_critSection;
template <class T>
inline T* Singleton<T>::Instance()
{
AutoThreadSection aSection(&m_critSection);
if( NULL == m_instance.get())
{
m_instance.reset ( new T);
}
return m_instance.get();
}
template<class T>
inline void Singleton<T>::ReleaseInstance()
{
AutoThreadSection aSection(&m_critSection);
m_instance.reset();
}
#define DECLARE_SINGLETON_CLASS( type ) \
friend class std::auto_ptr< type >;\
friend class Singleton< type >;
多线程时Instance()方法加锁保护,防止多线程同时进入创建多个实例。m_instance为auto_ptr指针类型,有get和reset方法。发现好多网上的程序没有对多线程进行处理,笔者觉得这样问题很大,因为如果不对多线程处理,那么多线程使用时就可能会生成多个实例,违背了单例模式存在的意义。加锁保护就意味着这段程序在绝大部分情况下,运行是没有问题的,这也就是笔者对自己写程序的要求,即如果提前预料到程序可能会因为某个地方没处理好而出问题,那么立即解决它;如果程序还是出问题了,那么一定是因为某个地方超出了我们的认知。
再附一下Java版的单例模式:
public class Singleton {
private Singleton() {
}
private static Singleton single = null;
public static Singleton getInstance() {
if (single == null) {
synchronized (Singleton.class) {
if (single == null) {
single = new Singleton();
}
}
}
return single;
}
}
上述代码中,一是对多线程做了处理,二是采用了双重加锁机制。由于synchronized每次都会获取锁,如果没有最外层的if (single == null)的判断,那么每次getInstance都必须获取锁,这样会导致性能下降,有了此判断,当生成实例后,就不会再获取锁。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# C++
# java
# 单例模式
# C++简明图解分析静态成员与单例设计模式
# C++设计模式之单例模式详解
# 使用设计模式中的单例模式来实现C++的boost库
# C++设计模式之单例模式
# C++单例设计模式详细讲解
# 多线程
# 多个
# 加锁
# 提供一个
# 是因为
# 最好的
# 在此
# 就不
# 一是
# 这段
# 我们可以
# 这也
# 给了
# 采用了
# 去做
# 如果没有
# 而出
# 它可以
# 时就
# 但它
相关文章:
专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?
香港服务器WordPress建站指南:SEO优化与高效部署策略
如何有效防御Web建站篡改攻击?
网站app免费制作软件,能免费看各大网站视频的手机app?
厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?
如何在景安服务器上快速搭建个人网站?
如何通过多用户协作模板快速搭建高效企业网站?
视频网站app制作软件,有什么好的视频聊天网站或者软件?
建站之星安装路径如何正确选择及配置?
免费网站制作模板下载,除了易企秀之外还有什么H5平台可以制作H5长页面,最好是免费的?
广东企业建站网站优化与SEO营销核心策略指南
广州网站制作的公司,现在专门做网站的公司有没有哪几家是比较好的,性价比高,模板也多的?
c# await 一个已经完成的Task会发生什么
简历在线制作网站免费,免费下载个人简历的网站是哪些?
*服务器网站为何频现安全漏洞?
网站制作公司排行榜,四大门户网站排名?
制作表格网站有哪些,线上表格怎么弄?
娃派WAP自助建站:免费模板+移动优化,快速打造专业网站
如何快速搭建高效香港服务器网站?
表情包在线制作网站免费,表情包怎么弄?
在线制作视频的网站有哪些,电脑如何制作视频短片?
如何通过远程VPS快速搭建个人网站?
上海网站制作网页,上海本地的生活网站有哪些?最好包括生活的各个方面的?
网站制作知乎推荐,想做自己的网站用什么工具比较好?
网站制作培训多少钱一个月,网站优化seo培训课程有哪些?
C#如何序列化对象为XML XmlSerializer用法
网站建设设计制作营销公司南阳,如何策划设计和建设网站?
如何快速重置建站主机并恢复默认配置?
建站之星IIS配置教程:代码生成技巧与站点搭建指南
建站之星3.0如何解决常见操作问题?
济南网站制作的价格,历城一职专官方网站?
如何用y主机助手快速搭建网站?
深圳网站制作培训,深圳哪些招聘网站比较好?
如何在IIS中新建站点并配置端口与物理路径?
武汉网站如何制作,黄黄高铁武穴北站途经哪些村庄?
制作网站的过程怎么写,用凡科建站如何制作自己的网站?
C#如何使用XPathNavigator高效查询XML
如何高效完成独享虚拟主机建站?
制作网站的软件免费下载,免费制作app哪个平台好?
网站制作壁纸教程视频,电脑壁纸网站?
制作网站的模板软件,网站怎么建设?
电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?
如何选择网络建站服务器?高效建站必看指南
如何在Windows服务器上快速搭建网站?
建站之星Pro快速搭建教程:模板选择与功能配置指南
如何高效配置香港服务器实现快速建站?
零基础网站服务器架设实战:轻量应用与域名解析配置指南
如何选择可靠的免备案建站服务器?
已有域名如何免费搭建网站?
北京网站制作网页,网站升级改版需要多久?
*请认真填写需求信息,我们会在24小时内与您取得联系。