中国的历史上很少出现两个皇帝并存的时期,是有,但不多,那我们就认为皇帝是个单例模式,在这个场景中,有皇帝,有大臣,大臣是天天要上朝参见皇帝的,今天参拜的皇帝应该和昨天、前天的一样(过渡期的不考虑,别找茬哦),大臣磕完头,抬头一看,嗨,还是昨天那个皇帝,单例模式,绝对的单例模式,先看类图:

单例模式最大的特点就是在类里有一个private构造函数,保证这个类不被其他类new出来。而getInstence是用来获得此类唯一的有一个实例化对象的方法。

经典的单例模式代码:

@SuppressWarnings("all")public class SingletonPattern {private static SingletonPattern singletonPattern= null;//限制住不能直接产生一个实例private SingletonPattern(){}public SingletonPattern getInstance(){if(this.singletonPattern == null){ //如果还没有实例,则创建一个this.singletonPattern = new SingletonPattern();}return this.singletonPattern;}}

客户端调用时,不能new出这个类的对象,只能通过getInstence是用来获得此类唯一的有一个实例化对象的方法,而getInstence里有句关于类中静态成员变量singletonPattern的存在判断,保证其唯一性。

当然这个例子有个很不完善的地方,就是遇到多线程问题时,假如现在有两个线程A和线程B,线程A执行到 this.singletonPattern = new SingletonPattern(),正在申请内存分配,可能需要0.001微秒,就在这0.001微秒之内,线程B执行到if(this.singletonPattern == null),你说这个时候这个判断条件是true还是false?是true,那然后呢?线程B也往下走,于是乎就在内存中就有两个SingletonPattern的实例了,看看是不是出问题了?

如果你这个单例是去拿一个序列号或者创建一个信号资源的时候,会怎么样?业务逻辑混乱!数据一致性校验失败!最重要的是你从代码上还看不出什么问题,这才是最要命的!因为这种情况基本上你是重现不了的,不寒而栗吧,那怎么修改?有很多种方案,我就说一种,能简单的、彻底解决问题的方案:

@SuppressWarnings("all")public class SingletonPattern {private static final SingletonPattern singletonPattern= new SingletonPattern();//限制住不能直接产生一个实例private SingletonPattern(){}public synchronized static SingletonPattern getInstance(){return singletonPattern;}}

直接new一个对象传递给类的成员变量singletonpattern,你要的时候getInstance()直接返回给你,解决问题!

另外,如果你不想singletonPattern 一个初始值,也可以通过synchronized关键字声明getInstence方法,保证只有一个线程访问此方法来解决。

转载于:https://www.cnblogs.com/winkey4986/archive/2012/03/26/2417369.html

单例模式小记【原创】相关推荐

  1. 炒冷饭系列:设计模式 单例模式

    2019独角兽企业重金招聘Python工程师标准>>> 炒冷饭系列:设计模式 单例模式 摘要: 原创出处: http://www.cnblogs.com/Alandre/ 泥沙砖瓦浆 ...

  2. mysql-generator用法_【原创】MyBatis Generator使用小记

    [原创]MyBatis Generator使用小记 leeon | 分享未来 2014-08-23 3195 阅读 最近在新的项目中使用Mybatis提供的generator工具来自动生成代码,为了提 ...

  3. 小记:再谈单例模式静态类区别优势

    有时候感觉单例模式与静态类的区别并不是那么明显,都是与数据无关的操作类,即整个过程不能太多的数据依赖--更准确的说是对象依赖,最好是其只负责处理某一类型(传入的可以是接口)的对象,看看下面这段代码: ...

  4. 单例模式(Singleton)小记

    概念 引用维基百科对单例的说明: 单例模式,也叫单子模式,是一种常用的软件设计模式.在应用这个模式时,单例对象的类必须保证只有一个实例存在. 继续引用维基百科的实现思路: 实现单例模式的思路是:一个类 ...

  5. php中单例和工厂模式,PHP单例模式和工厂模式小记!

    //空对象 new stdClass() == object(null); //在php语言中,一个对象还可以使用clone运算符进行克隆,则就也会"生成"新对象. //因此,还需 ...

  6. [原创]VS2008 英文版转为中文版之小记

    在VS2008刚出来的时候,那个版本是英语试用版,处于对新事物的好奇,就下载一个iso来安装,当然也会下一个TFS2008来试用的. 过个近半年的时间,中文版总算出来了(做为中国人当然是选择中文版), ...

  7. 模板方法模式小记【原创】

    模板方法模式,定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类中可以不改变的一个算法的结构即可重定义该算法的某些特定步骤. 首先来看下模板方法模式的结构图: AbstractCl ...

  8. 中介者模式小记【原创】

    几天没写设计模式的总结了,工作上要学的事情多,觉得写写挺麻烦.可是这几天下来发现没写总结后,新学的几个模式之间的区别都搞混淆了,看来做学问真的是没有捷径的.写吧! 先来看一个公司的部门关系 怎么样,由 ...

  9. [原创]HD2自刷安卓2.2小记

    前几天自己买了个HTC HD2,大家都说这个是去年的怪兽级机器,由于其可以升级未来的andriod和WP7,所以升值潜力不限. PS:自己算是个智能机小白,从未刷过手机,因为不懂+胆小,所以也就是个门 ...

最新文章

  1. 毕业之后,这些年薪50万+的90后程序员经历了什么?
  2. Python的IDE之PyCharm:PyCharm的使用技巧图文教程(修改Pycharm默认风格颜色、编辑器内代码注释区域的颜色、编辑器内的Python Interpreter等)之详细攻略
  3. 7.3.7 - 并发多线程 死锁和递归锁
  4. 【快乐水题】575. 分糖果
  5. 利用matlab点云工具处理点云
  6. 4023-基于双向链表的双向冒泡排序法
  7. total是什么牌子的电脑_干货!如何用Python在笔记本电脑上分析100GB数据(上)...
  8. 安徽省计算机二级考试教程,安徽省计算机二级自学教程推荐:Office高级应用上机指导(2018年版)...
  9. 一步一步写算法(之单向链表)
  10. setitime和相关函数
  11. dx 汇编dec_汇编语言算术指令
  12. 线性代数07 克拉默法则(Cramer)
  13. SPSS 安装后不可用 没有出现授权 不显示工具栏 桌面没有快捷图标
  14. 【Java项目】OA办公管理系统-万字细致讲解
  15. SpringMVC框架原理图
  16. Python编程从入门到实践(第五章练习)
  17. 坚果云企业版服务器端,坚果云团队版和企业版的区别
  18. 个人提交专利,对说明书内容会进行查重吗
  19. SpringSecurity(二) :授权流程
  20. DPABI详细使用教材——数据准备、预处理流程、数据分析流程

热门文章

  1. 2021年算法工作总结
  2. LeetCode MySQL 1581. 进店却未进行过交易的顾客
  3. 天池 在线编程 最大子树(自底向上)
  4. 天池 在线编程 最小的行程(动态规划)
  5. LeetCode 555. 分割连接字符串
  6. LeetCode 873. 最长的斐波那契子序列的长度(动态规划)
  7. 数据结构--树状数组
  8. 程序员面试金典 - 面试题 05.07. 配对交换(位运算)
  9. 协程asyncio_Asyncio深入浅出
  10. qr分解求线性方程组_计算方法/数值分析第三章 线性方程组的数值解法