|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
net程序员的大部门代码都靠控件拖拽完成的,虽然java也有,但是无论从美观和速度上都没发和.net比。java程序员都是代码完成的,所以java程序员常戏称.net程序员是操作员,呵呵。
单例对象(Singleton)是一种经常使用的计划形式。在Java使用中,单例对象能包管在一个JVM中,该对象只要一个实例存在。恰是因为这个特性,单例对象一般作为程序中的寄存设置信息的载体,由于它能包管其他对象读到分歧的信息。比方在某个服务器程序中,该服务器的设置信息大概寄存在数据库或文件中,这些设置数据由某个单例对象一致读取,服务历程中的其他对象假如要猎取这些设置信息,只需会见该单例对象便可。这类体例极年夜地简化了在庞大情况下,特别是多线程情况下的设置办理,可是跟着使用场景的分歧,也大概带来一些同步成绩。
本文将切磋一下在多线程情况下,利用单例对象作设置信息办理时大概会带来的几个同步成绩,并针对每一个成绩给出可选的办理举措。
成绩形貌
在多线程情况下,单例对象的同步成绩次要表现在两个方面,单例对象的初始化和单例对象的属性更新。
本文形貌的办法有以下假定:
1.单例对象的属性(或成员变量)的猎取,是经由过程单例对象的初始化完成的。也就是说,在单例对象初始化时,会从文件或数据库中读取最新的设置信息。
2.其他对象不克不及间接改动单例对象的属性,单例对象属性的变更来历于设置文件或设置数据库数据的变更。
1.1单例对象的初始化
起首,会商一下单例对象的初始化同步。单例形式的一般处置体例是,在对象中有一个静态成员变量,其范例就是单例范例自己;假如该变量为null,则创立该单例范例的对象,并将该变量指向这个对象;假如该变量不为null,则间接利用该变量。
其历程以下面代码所示:
publicclassGlobalConfig{
privatestaticGlobalConfiginstance=null;
privateVectorproperties=null;
privateGlobalConfig(){
//LoadconfigurationinformationfromDBorfile
//Setvaluesforproperties
}
publicstaticGlobalConfiggetInstance(){
if(instance==null){
instance=newGlobalConfig();
}
returninstance;
}
publicVectorgetProperties(){
returnproperties;
}
}
这类处置体例在单线程的形式下能够很好的运转;可是在多线程形式下,大概发生成绩。假如第一个线程发明成员变量为null,筹办创立对象;这是第二个线程同时也发明成员变量为null,也会创立新对象。这就会形成在一个JVM中有多个单例范例的实例。假如这个单例范例的成员变量在运转过程当中变更,会形成多个单例范例实例的纷歧致,发生一些很奇异的征象。比方,某服务历程经由过程反省单例对象的某个属性来中断多个线程服务,假如存在多个单例对象的实例,就会形成部分线程服务中断,部分线程服务不克不及中断的情形。
<p>
你总不能说你写框架吧,那无疑会加大工作量,现在大多企业采取的是折中的办法,就是改别人写好的框架,可要改框架,前提是你对这个框架足够的了解,这就更难了。 |
|