再看设计模式——单例模式

栏目: 后端 · 发布时间: 5年前

内容简介:这个模式其实就是要保证只有一个实例存在。通常的实现思路就是持有一个私有静态实例,保证仅一次初始化,以getInstance方法返回。但是实际实现这个模式要考虑更多细节:使用C++实现还必须额外注意一些实现细节C++考虑延迟初始化的线程安全,推荐的实现一种是DLC并添加必要的内存屏障

这个模式其实就是要保证只有一个实例存在。通常的实现思路就是持有一个私有静态实例,保证仅一次初始化,以getInstance方法返回。但是实际实现这个模式要考虑更多细节:

  1.  线程安全与DLC
  2. 单例对象的析构与销毁
  3. 组件中单例对象的管理
  4. 单例模式的单元测试

使用C++实现还必须额外注意一些实现细节

  • 静态成员变量初始化顺序不依赖构造函数, 多个单例可能初始化顺序不对
  • 延迟初始化(第一次使用才初始化)需要考虑线程安全
  • 接口返回引用更安全,防止被误delete,C++11以后推荐使用智能指针
  • 将default产生的函数定义为private
  • 注意最后析构问题,要有检查dead-reference

C++考虑延迟初始化的线程安全,推荐的实现一种是DLC并添加必要的内存屏障 1 ,Linux上面也可以利用pthread_once来实现。

考虑到通用性更好的一种是使用Proxy-Class,可以参考Boost的实现 3 。C++11以后已经有了解决线程安全最佳的实现,就是使用并返回局部静态变量 2

使用 Java 实现因为volatile语义的加强,将私有静态实例声明后可以直接使用DLC,但这种实现并没有性能优势。由于JVM内部的机制能够保证当一个类被加载的时候,这个类的加载过程是线程互斥的。因此可以使用获取内部类的实例来实现。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

软件开发本质论

软件开发本质论

Ron Jeffries / 王凌云 / 人民邮电出版社图灵分社 / 2017-1 / 39

想象你正在攀登一座名为“软件开发”的山峰。本书是与你同登一座山峰的敏捷先驱所带来的话语与图片。他在崎岖的山路边找到相当平坦的歇脚处,画下所见的风景,并写下自己的想法和发现。他瞧见很多条上山的路,愿以此书与你分享哪条路容易、哪条路困难、哪条路安全、哪条路危险。他还想指引你欣赏身后的美景。正是这些美景丰富了你的登山之旅,让你在重重困难中收获成长。 “对于每一位CTO、技术VP、软件产品总......一起来看看 《软件开发本质论》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

MD5 加密
MD5 加密

MD5 加密工具