来看Java实际与理论: 并发汇合类
大型的应用一般不会用这些框架(因为性能考虑);开发人员根据需要选择用一些框架,也可以不选用框架;不用框架并不代表要自己写框架;修改框架的可能性更小。在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也是延续着它的拖拽控件的方法,提高速度。 还好,SUN提供了Javabean可以把你的JSP中的 Java代码封装起来,便于调用也便于重用。 我大二,Java也只学了一年,觉得还是看thinking in java好,有能力的话看英文原版(中文版翻的不怎么好),还能提高英文文档阅读能力。 Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、ServerSocket等。Java的RMI(远程方法激活)机制也是开发分布式应用的重要手段。 象、泛型编程的特性,广泛应用于企业级Web应用开发和移动应用开发。 多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间,使得程序员不用再为内存管理而担忧。在 Java 1.5 版本中,Java 又引入了泛型编程(Generic Programming)、类型安全的枚举、不定长参数和自动装/拆箱等语言特性。 有时间再研究一下MVC结构(把Model-View-Control分离开的设计思想) 关于设计模式的资料,还是向大家推荐banq的网站 http://www.jdon.com/,他把GOF的23种模式以通俗易懂的方式诠释出来,纯Java描述,真是经典中的经典。 象、泛型编程的特性,广泛应用于企业级Web应用开发和移动应用开发。 接着就是EJB了,EJB就是Enterprise JavaBean, 看名字好象它是Javabean,可是它和Javabean还是有区别的。它是一个体系结构,你可以搭建更安全、更稳定的企业应用。它的大量代码已由中间件(也就是我们常听到的 Weblogic,Websphere这些J2EE服务器)完成了,所以我们要做的程序代码量很少,大部分工作都在设计和配置中间件上。 如果要向java web方向发展也要吧看看《Java web从入门到精通》学完再到《Struts2.0入门到精通》这样你差不多就把代码给学完了。有兴趣可以看一些设计模块和框架的包等等。 吧,现在很流行的Structs就是它的一种实现方式,不过Structs用起来实在是很繁,我们只要学习其精髓即可,我们完全可以设计自己的MVC结构。然后你再研究一下软件Refactoring (重构)和极限XP编程,相信你又会上一个台阶。 做完这些,你不如整理一下你的Java代码,把那些经典的程序和常见的应用整理出来,再精心打造一番,提高其重用性和可扩展性。你再找几个志同道合的朋友成立一个工作室吧 是一种由美国SUN计算机公司(Sun Microsystems, Inc.)所研究而成的语言 是一种使用者不需花费很多时间学习的语言
页:
[1]