




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1、单例模式单例对象Singletori是一种常用的设计模式。在Java®用中,单例对象能保证在一个JVM中,该对象只有一个实例存在。正是由于这个特点,单例对象通常作为程序中的存放配置信息的载体,因为它能保证其他对象读到一致的信息。例如在某个效劳器程序中,该效劳器的配置信息可能存放在数据库或文件中,这些配置数据由某个单例对象统一读取,效劳进程中的其他对象如果要获取这些配置信息,只需该单例对象即可。这种方式极大地简化了在复杂环境下,尤其是多线程环境下的配置管理,但是随着应用场景的不同,也可能带来一些同步问题。本文将探讨一下在多线程环境下,使用单例对象作配置信息管理时可能会带来的几个同步
2、问题,并针对每个问题给出可选的解决方法。问题描述在多线程环境下,单例对象的同步问题主要表达在两个方面,单例对象的初始化和单例对象的属性更新。本文描述的方法有如下假设:1. 单例对象的属性或成员变量的获取,是通过单例对象的初始化实现的。也就是说,在单例对象初始化时,会从文件或数据库中读取最新的配置信息。2. 其他对象不能直接改变单例对象的属性,单例对象属性的变化来源于配置文件或配置数据库数据的变化。1.1 单例对象的初始化首先,讨论一下单例对象的初始化同步。单例模式的通常处理方式是,在对象中有一个静态成员变量,其类型就是单例类型本身;如果该变量为null,那么创立该单例类型的对象,并将该变量指向
3、这个对象;如果该变量不为null,那么直接使用该变量。其过程如下面代码所示:publicclassGlobalConfigprivatestaticGlobalConfiginstance=null;privateVectorproperties=null;privateGlobalConfig()/LoadconfigurationinformationfromDBorfile/SetvaluesforpropertiespublicstaticGlobalConfiggetInstance()if(instance=null)instance=newGlobalConfig();retur
4、ninstance;publicVectorgetProperties()returnproperties;这种处理方式在单线程的模式下可以很好的运行;但是在多线程模式下,可能产生问题。如果第一个线程发现成员变量为null,准备创立对象;这是第二个线程同时也发现成员变量为null,也会创立新对象。这就会造成在一个JVM中有多个单例类型的实例。如果这个单例类型的成员变量在运行过程中变化,会造成多个单例类型实例的不一致,产生一些很奇怪的现象。例如,某效劳进程通过检查单例对象的某个属性来停顿多个线程效劳,如果存在多个单例对象的实例,就会造成局部线程效劳停顿,局部线程效劳不能停顿的情况。1.2 单例对
5、象的属性更新通常,为了实现配置信息的实时更新,会有一个线程不停检测配置文件或配置数据库的内容,一旦发现变化,就更新到单例对象的属性中。在更新这些信息的时候,很可能还会有其他线程正在读取这些信息,造成意想不到的后果。还是以通过单例对象属性停顿线程效劳为例,如果更新属性时读写不同步,可能该属性时这个属性正好为空null,程序就会抛出异常。解决方法2.1 单例对象的初始化同步对于初始化的同步,可以通过如下代码所采用的方式解决。publicclassGlobalConfigprivatestaticGlobalConfiginstance=null;privateVectorproperties=nu
6、ll;privateGlobalConfig。/LoadconfigurationinformationfromDBorfile/SetvaluesforpropertiesprivatestaticsynchronizedvoidsyncInit()if(instance=null)instance=newGlobalConfig。;publicstaticGlobalConfiggetInstance()if(instance=null)syncInit();returninstance;publicVectorgetProperties()returnproperties;这种处理方式虽
7、然引入了同步代码,但是因为这段同步代码只会在最开场的时候执行一次或屡次,所以对整个系统的性能不会有影响。2.2 单例对象的属性更新同步为了解决第2个问题,有两种方法:1,参照读者/写者的处理方式设置一个读计数器,每次读取配置信息前,将计数器加1,读完后将计数器减1只有在读计数器为0时,才能更新数据,同时要阻塞所有读属性的调用。代码如下。publicclassGlobalConfigprivatestaticGlobalConfiginstance;privateVectorproperties=null;privatebooleanisUpdating=false;privateintread
8、Count=0;privateGlobalConfig()/LoadconfigurationinformationfromDBorfile/SetvaluesforpropertiesprivatestaticsynchronizedvoidsyncInit()if(instance=null)instance=newGlobalConfig();publicstaticGlobalConfiggetInstance()if(instance=null)syncInit();returninstance;publicsynchronizedvoidupdate(Stringp_data)sy
9、ncUpdateIn();/UpdatepropertiesprivatesynchronizedvoidsyncUpdateIn()while(readCount>0)trywait();catch(Exceptione)privatesynchronizedvoidsyncReadIn()readCount+;privatesynchronizedvoidsyncReadOut()readCount-;notifyAll();publicVectorgetProperties()syncReadIn();/ProcessdatasyncReadOut();returnproperti
10、es;2,采用“影子实例”的方法具体说,就是在更新属性时,直接生成另一个单例对象实例,这个新生成的单例对象实例将从数据库或文件中读取最新的配置信息;然后将这些配置信息直接赋值给旧单例对象的属性。如下面代码所示。publicclassGlobalConfigprivatestaticGlobalConfiginstance=null;privateVectorproperties=null;privateGlobalConfig()/LoadconfigurationinformationfromDBorfile/Setvaluesforpropertiesprivatestaticsynchr
11、onizedvoidsyncInit()if(instance=null)instance=newGlobalConfig();publicstaticGlobalConfiggetInstance()if(instance=null)syncInit();returninstance;publicVectorgetProperties()returnproperties;publicvoidupdateProperties()/LoadupdatedconfigurationinformationbynewaGlobalConfigobjectGlobalConfigshadow=newGl
12、obalConfig();properties=shadow.getProperties();注意:在更新方法中,通过生成新的GlobalConfig的实例,从文件或数据库中得到最新配置信息,并存放到properties属性中。上面两个方法比拟起来,第二个方法更好,首先,编程更简单;其次,没有那么多的同步操作,对性能的影响也不大。2、单例模式2java模式之单例模式:单例模式确保一个类只有一个实例,自行提供这个实例并向整个系统提供这个实例。特点:1,一个类只能有一个实例2,自己创立这个实例3,整个系统都要使用这个实例例:在下面的对象图中,有一个“单例对象",而"客户甲&qu
13、ot;、"客户乙"和"客户丙”是单例对象的三个客户对象。可以看到,所有的客户对象共享一个单例对象。而且从单例对象到自身的连接线可以看出,单例对象持有对自己的引用。nSingleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。在很多操作中,比方建立目录数据库连接都需要这样的单线程操作。一些资源管理器常常设计成单例模式。外部资源:譬如每台计算机可以有假设干个打印机,但只能有一个PrinterSpooler以防止两个打印作业同时输出到打印机中。每台计算机可以有假设干个通信端口,系统应当集中管理这些通信端口,以防止一个通信端口被两个请求同时
14、调用。内部资源,譬如,大多数的软件都有一个甚至多个属性文件存放系统配置。这样的系统应当由一个对象来管理这些属性文件。一个例子:Windows回收站。在整个视窗系统中,回收站只能有一个实例,整个系统都使用这个惟一的实例,而且回收站自行提供自己的实例。因此,回收站是单例模式的应用。两种形式:1,饿汉式单例类publicclassSingletonprivateSingleton。在自己内部定义自己一个实例,是不是很奇怪?/注意这是private只供内部调用privatestaticSingletoninstance=newSingleton();/这里提供了一个供外部本class的静态方法,可以直
15、接publicstaticSingletongetInstance()returninstance;2,懒汉式单例类publicclassSingletonprivatestaticSingletoninstance=null;publicstaticsynchronizedSingletongetInstance()/这个方法比上面有所改良,不用每次都进展生成对象,只是第一次/使用时生成实例,提高了效率!if(instance=null)instance=newSingleton();returninstance;第二中形式是lazyinitialization,也就是说第一次调用时初始Si
16、ngleton,以后就不用再生成了。注意至Ulazyinitialization形式中的synchronized这个synchronize由艮重要,如果没有synchronized那么使用getInstance(是有可能得到多个Singleton实例。一般来说第一种比拟平安。用单例模式实现的java连接MySql数据库package.adrop.util;importjava.sql.*;publicclassDBManager/用户名privateStringuser=/密码privateStringpassword=""/主机privateStringhost=&quo
17、t;"/数据库名字privateStringdatabase=""/privateDBManagerdbm=null;/*privateStringurl="jdbc:mysql:/"+host+"/"+"useUnicode=true&characterEncoding=GB2312"*/privateStringurl=""privateConnectioncon=null;Statementstmt;/*私有的构造方法,保证外部不能实例化,只能由DBManager自己能提
18、供自*己的实例,并且只能有一个。*根据主机、数据库名称、数据库用户名、数据库用户密码取得连接。*paramhostString*paramdatabaseStringparamuserStringparampasswordString*/privateDBManager(Stringhost,Stringdatabase,Stringuser,Stringpassword)this.host=host;this.database=database;this.user=user;this.password=password;/显示中文this.url="jdbc:mysql:/&quo
19、t;+host+"/"+database+"?useUnicode=true&characterEncoding=GB2312"tryClass.forName("org.gjt.mm.mysql.Driver");catch(ClassNotFoundExceptione)System.err.println("classnotfound:"+e.getMessage();trycon=DriverManager.getConnection(this.url,this.user,this.password);/连接类型为ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCURREADONLYstmt=con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_RE
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 网络工程师综合能力试题及答案
- 2024年互联网架构开发考试核心试题及答案
- 2024年商务礼仪师重要考点概述试题及答案
- 企业会议的礼仪要求试题及答案
- 移动营销发展趋势试题及答案
- 信息安全与网络工程的交汇考点试题及答案
- 须知2024年酒店管理师试题及答案
- 一站式酒店管理师试题及答案
- 市场营销师考试策略分析试题及答案
- 如何提升员工服务意识试题及答案
- 山东烟草在线测评题答案
- 2024矿山开采设计规范
- 职业技术学院《装配式混凝土构件生产与管理》课程标准
- 数科OFD版式软件系列产品白皮书整体
- GB/T 44328-2024七氟异丁腈
- 保安员资格测试题库300题(含标准答案)
- (完整版)智力七巧板整册教案
- 微流控器官芯片的医疗应用
- 《3.2动能定理的应用》 教学课件
- 液化气站双重预防体系手册
- 春季中医养生课件
评论
0/150
提交评论