|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
大型的应用一般不会用这些框架(因为性能考虑);开发人员根据需要选择用一些框架,也可以不选用框架;不用框架并不代表要自己写框架;修改框架的可能性更小。
在Java类库中呈现的第一个联系关系的汇合类是Hashtable,它是JDK1.0的一部分。Hashtable供应了一种易于利用的、线程平安的、联系关系的map功效,这当然也是便利的。但是,线程平安性是凭价值换来的DDHashtable的一切办法都是同步的。此时,无合作的同步会招致可不雅的功能价值。Hashtable的后继者HashMap是作为JDK1.2中的汇合框架的一部分呈现的,它经由过程供应一个分歧步的基类和一个同步的包装器Collections.synchronizedMap,办理了线程安全性成绩。经由过程将基础的功效从线程平安性平分分开来,Collections.synchronizedMap同意必要同步的用户能够具有同步,而不必要同步的用户则不用为同步支付价值。
Hashtable和synchronizedMap所接纳的取得同步的复杂办法(同步Hashtable中大概同步的Map包装器对象中的每一个办法)有两个次要的不敷。起首,这类办法关于可伸缩性是一种停滞,由于一次只能有一个线程能够会见hash表。同时,如许仍不敷以供应真实的线程平安性,很多公用的夹杂操纵仍旧必要分外的同步。固然诸如get()和put()之类的复杂操纵能够在不必要分外同步的情形下平安地完成,但仍是有一些公用的操纵序列,比方迭代大概put-if-absent(空则放进),必要内部的同步,以免数据争用。
有前提的线程平安性
同步的汇合包装器synchronizedMap和synchronizedList,偶然也被称作有前提地线程平安DD一切单个的操纵都是线程平安的,可是多个操纵构成的操作序列却大概招致数据争用,由于在操纵序列中把持流取决于后面操纵的了局。清单1中第一片断展现了公用的put-if-absent语句块DD假如一个条目不在Map中,那末增加这个条目。不幸的是,在containsKey()办法前往到put()办法被挪用这段工夫内,大概会有另外一个线程也拔出一个带有不异键的值。假如您想确保只要一次拔出,您必要用一个对Mapm举行同步的同步块将这一对语句包装起来。
清单1中其他的例子与迭代有关。在第一个例子中,List.size()的了局在轮回的实行时代大概会变得有效,由于另外一个线程能够从这个列表中删除条目。假如机会不妥当,在恰好进进轮回的最初一次迭代以后有一个条目被另外一个线程删除,则List.get()将前往null,而doSomething()则极可能会抛出一个NullPointerException非常。那末,接纳甚么措施才干制止这类情形呢?如果当您正在迭代一个List时另外一个线程也大概正在会见这个List,那末在进行迭代时您必需利用一个synchronized块将这个List包装起来,在List1上同步,从而锁住全部List。如许做固然办理了数据争用成绩,可是在并发性方面支付了更多的价值,由于在迭代时代锁住全部List会堵塞其他线程,使它们在很长一段工夫内不克不及会见这个列表。
汇合框架引进了迭代器,用于遍历一个列表大概其他汇合,从而优化了对一个汇合中的元素举行迭代的历程。但是,在java.util汇合类中完成的迭代器极易溃散,也就是说,假如在一个线程正在经由过程一个Iterator遍历汇合时,另一个线程也来修正这个汇合,那末接上去的Iterator.hasNext()或Iterator.next()挪用将抛出ConcurrentModificationException非常。就拿方才这个例子来说,假如想要避免呈现ConcurrentModificationException异常,那末当您正在举行迭代时,您必需利用一个在Listl上同步的synchronized块将该List包装起来,从而锁住全部List。(大概,您也可以挪用List.toArray(),在分歧步的情形下对数组举行迭代,可是假如列表比较年夜的话如许做价值很高)。
清单1.同步的map中的公用合作前提
Mapm=Collections.synchronizedMap(newHashMap());
Listl=Collections.synchronizedList(newArrayList());
//put-if-absentidiom--containsaracecondition
//mayrequireexternalsynchronization
if(!map.containsKey(key))
map.put(key,value);
//ad-hociteration--containsraceconditions
//mayrequireexternalsynchronization
for(inti=0;i<list.size();i++){
doSomething(list.get(i));
}
//normaliteration--canthrowConcurrentModificationException
//mayrequireexternalsynchronization
for(Iteratori=list.iterator();i.hasNext();){
doSomething(i.next());
}
信托的错觉
synchronizedList和synchronizedMap供应的有前提的线程平安性也带来了一个隐患DD开辟者会假定,由于这些汇合都是同步的,以是它们都是线程平安的,如许一来他们关于准确地同步夹杂操纵这件事就会忽略。其了局是只管外表上这些程序在负载较轻的时分可以一般事情,可是一旦负载较重,它们就会入手下手抛出NullPointerException或ConcurrentModificationException。
<p>
j2EE和asp比较,其实也没什么比的,原因和我上面说那些比较差不了多少,也是稳定性,安全性,J2EE比asp高,速度上比不过asp,asp也是延续着它的拖拽控件的方法,提高速度。 |
|