单例模式(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++单例设计模式详细讲解
# 多线程
# 多个
# 加锁
# 提供一个
# 是因为
# 最好的
# 在此
# 就不
# 一是
# 这段
# 我们可以
# 这也
# 给了
# 采用了
# 去做
# 如果没有
# 而出
# 它可以
# 时就
# 但它
相关文章:
网站制作员失业,怎样查看自己网站的注册者?
兔展官网 在线制作,怎样制作微信请帖?
C#如何在一个XML文件中查找并替换文本内容
如何在阿里云高效完成企业建站全流程?
如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?
C++ static_cast和dynamic_cast区别_C++静态转换与动态类型安全转换
Bpmn 2.0的XML文件怎么画流程图
网站专业制作公司有哪些,做一个公司网站要多少钱?
山东云建站价格为何差异显著?
,石家庄四十八中学官网?
网站制作网站,深圳做网站哪家比较好?
,网站推广常用方法?
如何彻底卸载建站之星软件?
建站之星安装失败:服务器环境不兼容?
高防服务器:AI智能防御DDoS攻击与数据安全保障
专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?
php条件判断怎么写_ifelse和switchcase的使用区别【对比】
常州自助建站:操作简便模板丰富,企业个人快速搭建网站
建站上市公司网站建设方案与SEO优化服务定制指南
海南网站制作公司有哪些,海口网是哪家的?
公司网站建设制作费用,想建设一个属于自己的企业网站,该如何去做?
,网页ppt怎么弄成自己的ppt?
如何零基础在云服务器搭建WordPress站点?
香港服务器部署网站为何提示未备案?
如何快速查询域名建站关键信息?
宿州网站制作公司兴策,安徽省低保查询网站?
如何通过NAT技术实现内网高效建站?
如何快速搭建高效WAP手机网站吸引移动用户?
设计网站制作公司有哪些,制作网页教程?
青岛网站建设如何选择本地服务器?
企业网站制作公司网页,推荐几家专业的天津网站制作公司?
建站之星伪静态规则如何设置?
如何挑选高效建站主机与优质域名?
武汉网站制作费用多少,在武汉武昌,建面100平方左右的房子,想装暖气片,费用大概是多少啊?
公司网站制作价格怎么算,公司办个官网需要多少钱?
如何通过VPS搭建网站快速盈利?
建站之星后台密码如何安全设置与找回?
网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?
如何做网站制作流程,*游戏网站怎么搭建?
保定网站制作方案定制,保定招聘的渠道有哪些?找工作的人一般都去哪里看招聘信息?
建站主机与服务器功能差异如何区分?
深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?
子杰智能建站系统|零代码开发与AI生成SEO优化指南
建站之星代理如何获取技术支持?
实现虚拟支付需哪些建站技术支撑?
高防服务器租用如何选择配置与防御等级?
如何在腾讯云服务器上快速搭建个人网站?
广州营销型建站服务商推荐:技术优势与SEO优化解析
如何确保FTP站点访问权限与数据传输安全?
如何通过山东自助建站平台快速注册域名?
*请认真填写需求信息,我们会在24小时内与您取得联系。