欢迎来到天天文库
浏览记录
ID:40415581
大小:227.96 KB
页数:28页
时间:2019-08-02
《Singleton(单例)》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、Singleton(单例)——唯一的对象实例定义通常程序在运行时,会产生许多对象实例,如java.lang.String类的对象实例如何控制用户使用new对一个类的实例构造器的任意调用,提供一种机制来保证一个类只有一个实例?有没有更通用的方法——SingletonPattern定义对象应该在程序启动时被创建,并且在结束时被删除,如应用程序的基础高层对象通过这个对象可以得到系统中其他的对象工厂对象(Factories),用来创建其他对象;管理器对象(managers),负责控管其他对象;全局注册表(Registry)。类似这种
2、类型的对象不该被创造出多份定义保证一个类仅有一个实例,并提供一个访问它的全局访问点,又叫单态模式或者单件模式类的对象的产生是由类的构造函数完成的,如果想限制对象的产生,可以将构造函数变为私有的(至少是受保护的)提供一个自己的对象以及访问这个对象的静态方法定义Singleton:单例提供一个instance方法,让客户可以使用它的唯一实例定义定义单例类中可以存在一些标识当前状态的属性,这个时候单例类就是有状态的反之,就是无状态的单例类。有状态的单例类常常用来当作状态库使用。例如,论坛中的帖子计数器,每次浏览一次需要计数,单态类
3、能保持住这个计数,并且能synchronize的安全自动加1,程序示例饿汉式懒汉式懒汉式publicclassSingleton{privatestaticSingletonsingleton=null;privateSingleton(){}publicstaticsynchronizedSingletongetInstance(){if(singleton==null){singleton=newSingleton();System.out.println(“已产生对象”);}returninstance;}}懒汉式构
4、造方法是私有的——外面不可能创建Singleton实例从内部创建需要一个方法来创建此实例——方法必须是static的需要一个属性存储对象——static的确保只生成一个实例——做判断懒汉式线程问题假设有两个线程,thread1,thread2thread1运行到第5行thread2也运行到第5行之后此时两线程都得到single为空那么就会有两个实例了解决办法——同步饿汉式publicclassSingleton{privatestaticSingletonsingleton=newSingleton;privateSing
5、leton(){System.out.println(“已产生对象”);}publicstaticSingletongetInstance(){returnsingleton;}}饿汉式publicclassMain{publicstaticvoidmain(String[]args){System.out.println(“开始”);Singletonobj1=Singleton.getInstance();Singletonobj2=Singleton.getInstance();if(obj1==obj2){Syst
6、em.out.println(“相同”);}else{System.out.println(“不同”);}System.out.println(“结束”);}}饿汉式因为static类型的属性,只在类加载时初始化一次,以后不会再初始化了,确保了只有一个实例说明构造函数是私有的,断开了使用构造函数得到类的实例的通道(但是类失去了多态性)懒汉式进行了同步处理——防止多线程环境中产生多个实例懒汉式第一次引用时被实例化;饿汉式类加载时被实例化饿汉式更符合Java语言特点说明单例模式在Java中的陷阱和假象多个虚拟机:在使用了EJB,
7、JINI,RMI等技术的分布式系统中,应避免使用存在状态的单例模式多个类加载器:单例类在多加载器的环境下会产生多个单例对象(注:类加载器就是Java虚拟机中用来把类加载到内存的工具)说明错误的同步处理串行化(可序列化),仅仅添加“implementsSerializable”不够,因为一个串行化的对象每次反串行化的时候,都会创建一个新的对象内部类式单例类public classSingleManager{privateSingleManager(){System.out.println("Singleton!");}stat
8、ic classSingletonHolder{private staticSingleManagerinstance = newSingleManager();}public staticSingleManagergetInstance(){returnSingletonHolder.i
此文档下载收益归作者所有