- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
8 Singleton(单例)
Singleton(单例)——唯一的对象实例 定义 通常程序在运行时,会产生许多对象实例,如java.lang.String类的对象实例 如何控制用户使用new对一个类的实例构造器的任意调用,提供一种机制来保证一个类只有一个实例? 有没有更通用的方法——Singleton Pattern 定义 对象应该在程序启动时被创建,并且在结束时被删除,如应用程序的基础高层对象 通过这个对象可以得到系统中其他的对象 工厂对象(Factories),用来创建其他对象; 管理器对象(managers),负责控管其他对象; 全局注册表(Registry)。 类似这种类型的对象不该被创造出多份 定义 保证一个类仅有一个实例,并提供一个访问它的全局访问点,又叫单态模式或者单件模式 类的对象的产生是由类的构造函数完成的,如果想限制对象的产生,可以将构造函数变为私有的(至少是受保护的) 提供一个自己的对象以及访问这个对象的静态方法 定义 Singleton: 单例 提供一个instance方法,让客户可以使用它的唯一实例 定义 定义 单例类中可以存在一些标识当前状态的属性,这个时候单例类就是有状态的 反之,就是无状态的单例类。有状态的单例类常常用来当作状态库使用。 例如,论坛中的帖子计数器,每次浏览一次需要计数,单态类能保持住这个计数,并且能synchronize的安全自动加1, 程序示例 饿汉式 懒汉式 懒汉式 public class Singleton{ private static Singleton singleton=null; private Singleton(){ } public static synchronized Singleton getInstance(){ if(singleton==null){ singleton=new Singleton(); System.out.println(“已产生对象”); } return instance; } } 懒汉式 构造方法是私有的——外面不可能创建Singleton实例 从内部创建 需要一个方法来创建此实例——方法必须是static的 需要一个属性存储对象——static的 确保只生成一个实例——做判断 懒汉式 线程问题 假设有两个线程,thread1,thread2 thread1运行到第5行 thread2也运行到第5行之后 此时两线程都得到single为空 那么就会有两个实例了 解决办法——同步 饿汉式 public class Singleton{ private static Singleton singleton=new Singleton; private Singleton(){ System.out.println(“已产生对象”); } public static Singleton getInstance(){ return singleton; } } 饿汉式 public class Main{ public static void main(String[] args){ System.out.println(“开始”); Singleton obj1=Singleton.getInstance(); Singleton obj2=Singleton.getInstance(); if(obj1==obj2){ System.out.println(“相同”); }else{ System.out.println(“不同”); } System.out.println(“结束”); } } 饿汉式 因为static类型的属性,只在类加载时初始化一次,以后不会再初始化了,确保了只有一个实例 说明 构造函数是私有的,断开了使用构造函数得到类的实例的通道(但是类失去了多态性) 懒汉式进行了同步处理——防止多线程环境中产生多个实例 懒汉式第一次引用时被实例化;饿汉式类加载时被实例化 饿汉式更符合Java语言特点 说明 单例模式在Java中的陷阱和假象 多个虚拟机:在使用了EJB,JINI,RMI等技术的分布式系统中,应避免使用存在状态的单例模式 多个类加载器:单例类在多加载器的环境下会产生多个单例对象(注:类加载器就是Java虚拟机中用来把类加载到内存的工具 ) 说明
文档评论(0)