单例模式是属于比较常用的一例,一个类(class)在内存中只有一个实例。

常用方式如下:

第一种(饿汉式):

public class Singleton {   

  private Singleton(){}   

  //在自己内部定义自己一个实例,是不是很奇怪?     //注意这是private 只供内部调用   

  private static Singleton instance = new Singleton();   

  //这里提供了一个供外部访问本class的静态方法,可以直接访问       public static Singleton getInstance() {       return instance;         }    }    

第二种方式:(懒汉式)

public class Singleton {    

  private static Singleton instance = null;   

  public static synchronized Singleton getInstance() {   

  //这个方法比上面有所改进,不用每次都进行生成对象,只是第一次          if (instance==null)       instance=new Singleton();     return instance;   }    

}   

比较安全的使用方式是第一种private static Singleton instance = new Singleton();

单例的陷井:

多个虚拟机

当单例类被运行在多个虚拟机下的时候,在每个虚拟机都可以创建一个实例对歇脚。像使用了EJB,JINI,RMI技术的分布式系统的时候,因为中间件屏蔽了分布式系统在物理上的差异,这个时候想知道在哪个虚拟机下运行着哪个单例对象很困难。因此在使用分布式技术时,应该避免使用

多个类加载器

当存在多个类加载器,即使它们加载的相同包名,相同类名甚至每个字节都完全相同的类,也会被区别对待的。因为不同的类加载器会使用不同的命名空间来区分同一个类,因此,单例类在多加载器的环境下会产生多个单例对象。也许你认为出现多个类加载器的情况不多,其实多个类加载器存在的情况不少,在很多J2EE服务器上允许存在多个SERVLET引擎,而每个引擎是采用不同的类加载器的,浏览器的APPLET小程序通过网络加载类的时候,由于安全因素,采用的是特殊类加载器,等等。

在这种情况,由状态的单例模式也会给系统带来隐患。因此除非系统由协调机制,在一般情况下不要使用存在状态的单例模式。

错误的同步处理

在使用上面介绍的懒汉式单模式的时候,同步得理恰当与否也是很,不然要能达不到想要的单例效果,还可能引发死锁等。因此在使用懒汉式单例模式时一定要对同步有所了解,不过使用饿汉式单例模式就可以避免这个问题。

子类破坏了对象控制

如果构造器变得不再私有,就有可能失去对对象的控制

串行化(可序列化)

为了使一个单例类变成可串行化的,仅仅在声明中添加“implements Serializable"是不够的,因为一个串行化的对象在每次反串行化的时候,都会创建一个新的对象,而不仅仅是一个对原有对象的引用,为了防止这种情况,可以在单例类中加入readResolve方法

public final class Singleton implements Serializable{          private Singleton () { }          private static final Singleton INSTANCE = new Singleton ();          public static Singleton getInstance() { return INSTANCE; }          private Object readResolve() throws ObjectStreamException {             return INSTANCE;         }      }    

对象的反串行化并不仅局限于上述方式,还存在基于 XML模式的对象串行化方式,这种方式也存在上述的问题,所以在使用的时候还要格外小心。

原文:http://lgh3292.iteye.com/blog/585037

设计模式之略见一斑(单例模式singleton)相关推荐

  1. Net设计模式实例之单例模式( Singleton Pattern)

    一.单例模式简介(Brief Introduction) 单例模式(Singleton Pattern),保证一个类只有一个实例,并提供一个访问它的全局访问点.单例模式因为Singleton封装它的唯 ...

  2. HeaFirst设计模式-单件模式[单例模式](Singleton Pattern)

    深入分析单件模式 本次主要介绍的内容有 单件模式 单线程下的单件模式实现 多线程下实现单件模式出现的问题分析 JMM内存模型 多线程下的单件模式实现的三种方式 这些内容,可以从最根本理解单例模式的代码 ...

  3. JavaScript设计模式 Item 6 --单例模式Singleton

    单例模式的定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点. 单例模式是一种常用的模式,有一些对象我们往往只需要一个,比如线程池.全局缓存.浏览器的window对象.在js开发中,单例模式的 ...

  4. java设计模式 单例_java设计模式一(单例模式singleton)

    1 概述 如果要保证系统里一个类最多只能存在一个实例时,我们就需要单例模式.这种情况在我们应用中经常碰到,例如缓存池.数据库连接池.线程池.一些应用服务实例等.在多线程环境中为了保证实例的唯一性其实并 ...

  5. 【设计模式笔记】单例模式Singleton Pattern

    单例模式是比较简单的一个模式,项目中也经常用得到. 实现细节 将类的构造方法设置为私有的(private),通过个公有的(public)的方法来获取类的实例. 代码示例 public class Si ...

  6. 《研磨设计模式》chap5 单例模式singleton

    1. 模式介绍 1.1 饱汉式单例实现 public class Singleton {//定义一个变量来存储创建好的类实例 private static Singleton uniqueInstan ...

  7. JAVA设计模式Design Pattern→单例模式Singleton Pattern、工厂模式Factory Pattern、代理模式Proxy Pattern

    私有化构造函数的类可以提供相应的 "接口"(一般就是静态方法)来返回自己的唯一实例供外部调用,像这样的确保只生成一个实例的模式被称作单例模式. 工厂模式,一个模型,用来大规模的生产 ...

  8. Android设计模式——单例模式(Singleton)

    二十三种设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元 ...

  9. 设计模式之单例模式——Singleton

                        设计模式之单例模式--Singleton 设计意图: 保证类仅有一个实例,并且可以供应用程序全局使用.为了保证这一点,就需要这个类自己创建自己的对象,并且对外有 ...

最新文章

  1. 智源学者朱军获2020年“科学探索奖”
  2. detime php_php试题及答案
  3. 【若依(ruoyi)】弹框图标 / layer 图标
  4. SQL注入-SQL注入的WAF绕过(十六)
  5. android抽奖动画,Android App中实现简单的刮刮卡抽奖效果的实例详解
  6. MVC @RenderBody、@RenderSection、@RenderPage、@Html.RenderPartial、@Html.RenderAction
  7. Linux 下 ascii 的查看方式
  8. c语言四个零,输入任意四个整数(0到10),运算符只有加减乘除,还有括号.每个数只能且必须用一次。要求判断这些表达的结果中是否有24。如果有,输出计算表达式:如输入4,6,1...
  9. VS-c++ 项目新建文件夹
  10. 二分之一波长传输线有啥用?
  11. ElasticSearch 图片搜索插件 (一)
  12. 把电脑做成服务器系统,把电脑做成云盘服务器
  13. 云计算的运营方式有哪些?
  14. 这家机场扶梯安装“智能管家”,扶梯消毒仪现高招,绝了!
  15. php中如何过滤关键字,PHP - 过滤关键字
  16. 淘淘商城第39讲——使用Spring来管理单机版Redis与集群版Redis
  17. 导航栏保持居中并使用swiper作为轮播图进行背景轮播背景
  18. Gradle自定义AAR文件名称
  19. 火山视窗文本数组类增删查改操作
  20. 职业价值观确认表? What is really important to you?

热门文章

  1. 接口自动化测试三大优势
  2. 名片大小的FPGA?方便固定又坚固耐用
  3. 远程抄表系统设备的维修流程
  4. 一二三级钢筋符号怎么打出来?
  5. 微信支付-全面详解(学习总结---从入门到深化)
  6. WebRTC技术专题(2)【大势所趋,迈向认识 WebRTC 的第一步】
  7. 【JAVA面试经历】苏州某硕信息面试总结
  8. SAP中事务F-03处理未清/非未清项管理科目对比测试
  9. 模具三维扫描 逆向抄数
  10. 荣耀手表2鸿蒙推送时间,鸿蒙OS正式版推送时间确定!荣耀机型也有份,六月初全面升级...