逍遥一派 发表于 2015-1-18 11:40:04

JAVA网页设计Servlet及JSP中的多线程同步成绩

你对java乐观有点盲目。java的关键就是在服务器上表现优异,而且它提供了整个开发所需要的工具。应该是说,看哪天。net有没有机会赶上java。js|servlet|多线程|成绩
  Servlet/JSP手艺和ASP、PHP等比拟,因为其多线程运转而具有很高的实行效力。因为Servlet/JSP默许是以多线程形式实行的,以是,在编写代码时必要十分仔细地思索多线程的同步成绩。但是,良多人编写Servlet/JSP程序时并没有注重到多线程同步的成绩,这常常形成编写的程序在大批用户会见时没有任何成绩,而在并发用户上升到必定值时,就会常常呈现一些莫明其妙的成绩,关于这类随机性的成绩调试难度也很年夜。

  1、在Servlet/JSP中的几种变量范例

  在编写Servlet/JSP程序时,对实例变量必定要当心利用。由于实例变量长短线程平安的。在Servlet/JSP中,变量能够回为上面的几类:

  1.类变量

  request,response,session,config,application,和JSP页面内置的page,pageContext。个中除application外,别的都是线程平安的。

  2.实例变量

  实例变量是实例一切的,在堆平分配。在Servlet/JSP容器中,一样平常仅实例化一个Servlet/JSP实例,启动多个该实例的线程来处置哀求。而实例变量是该实例一切的线程所共享,以是,实例变量不是线程平安的。

  3.部分变量

  部分变量在仓库平分配,由于每个线程有本人的实行仓库,以是,部分变量是线程平安的。

  2、在Servlet/JSP中的多线程同步成绩

  在JSP中,利用实例变量要出格审慎。起首请看上面的代码:

ffffffcellPadding=2width=540align=centerborderColorLight=blackborder=1>//instanceconcurrenttest.jsp<%@pagecontentType="text/html;charset=GBK"%><%!//界说实例变量Stringusername;Stringpassword;java.io.PrintWriteroutput;%><%//从request中猎取参数username=request.getParameter("username");password=request.getParameter("password");output=response.getWriter();showUserInfo();%><%!publicvoidshowUserInfo(){//为了凸起并提问题,在这儿起首实行一个费时操纵inti=0;doublesum=0.0;while(i++<200000000){sum+=i;}output.println(Thread.currentThread().getName()+"<br>");output.println("username:"+username+"<br>");output.println("password:"+password+"<br>");}%>

  在这个页面中,起首界说了两个实例变量,username和password。然后在从request中猎取这两个参数,并挪用showUserInfo()办法将哀求用户的信息回显在该客户的扫瞄器上。在一个用户会见是,不存在成绩。但在多个用户并发会见时,就会呈现别的用户的信息显现在别的一些用户的扫瞄器上的成绩。这是一个严峻的成绩。为了凸起并提问题,便于测试、察看,我们在回显用户信息时实行了一个摹拟的费时操纵,好比,上面的两个用户同时会见(能够启动两个IE扫瞄器,大概在两台呆板上同时会见):

a:http://localhost:8080/instanceconcurrenttest.jsp?username=a&password=123

b:http://localhost:8080/instanceconcurrenttest.jsp?username=b&password=456

假如a点击链接后,b再点击链接,那末,a将前往一个空缺屏幕,b则失掉a和b两个线程的输入。请看上面的屏幕截图:


<br>

:a的屏幕


<br>

:b的屏幕

  从运转了局的截图上能够看到,Web服务器启动了两个线程分离来处置来自a和b的哀求,可是在a却失掉一个空缺的屏幕。这是由于下面程序中的output,username和password都是实例变量,是一切线程共享的。在a会见该页面后,将output设置为a的输入,username,password分离置为a的信息,而在a实行printUserInfo()输入username和password信息前,b又会见了该页面,把username和password置为了b的信息,并把输入output指向到了b。随后a的线程打印时,就打印到了b的屏幕了,而且,a的用户名和暗码也被b的代替。请列入下图所示:


<br>

:a、b两个线程的工夫线

  而实践程序中,因为设置实例变量,利用实例变量这两个工夫点十分靠近,以是,像本例的同步成绩并没有这么凸起,大概会偶然呈现,但这却加倍具有伤害性,也加倍难于调试。

  一样,关于Servlet也存在实例变量的多线程成绩,请看下面页面的Servlet版:

//InstanceConcurrentTest.javaimportjavax.servlet.*;importjavax.servlet.http.*;importjava.io.PrintWriter;publicclassInstanceConcurrentTestextendsHttpServlet{Stringusername;Stringpassword;PrintWriterout;publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,java.io.IOException{//从request中猎取参数username=request.getParameter("username");password=request.getParameter("password");System.out.println(Thread.currentThread().getName()+"|setusername:"+username);out=response.getWriter();showUserInfo();}publicvoidshowUserInfo(){//为了凸起并提问题,在这儿起首实行一个费时操纵inti=0;doublesum=0.0;while(i++<200000000){sum+=i;}out.println("thread:"+Thread.currentThread().getName());out.println("username:"+username);out.println("password:"+password);}}

  3、办理计划

  1.以单线程运转Servlet/JSP

  在JSP中,经由过程设置:<%@pageisThreadSafe="false"%>,在Servlet中,经由过程完成javax.servlet.SingleThreadModel,此时Web容器将包管JSP或Servlet实例以单线程体例运转。

  主要提醒:在测试中发明,Tomcat4.1.17不克不及准确撑持isThreadSafe属性,以是,指定isTheadSafe为false后,在Tomcat4.1.17中仍旧呈现多线程成绩,这是Tomcat4.1.17的Bug。在Tomcat3.3.1和Resin2.1.5中测试经由过程。

  2.往除实例变量,经由过程参数传送

  从下面的剖析可见,应当在Servlet/JSP中只管制止利用实例变量。好比,上面的修改代码,往除实例变量,经由过程界说部分变量,并参数举行传送。如许,因为部分变量是在线程的仓库中举行分派的,以是是线程平安的。不会呈现多线程同步的成绩。代码以下:

<%@pagecontentType="text/html;charset=GBK"%><%//利用部分变量Stringusername;Stringpassword;java.io.PrintWriteroutput;//从request中猎取参数username=request.getParameter("username");password=request.getParameter("password");output=response.getWriter();showUserInfo(output,username,password);%><%!publicvoidshowUserInfo(java.io.PrintWriter_output,String_username,String_password){//为了凸起并提问题,在这儿起首实行一个费时操纵inti=0;doublesum=0.0;while(i++<200000000){sum+=i;}_output.println(Thread.currentThread().getName()+"<br>");_output.println("username:"+_username+"<br>");_output.println("password:"+_password+"<br>");}%>

注:有的材料上指出在printUserInfo()办法大概实例变量的相干操纵语句上利用synchronized关头字举行同步,但如许其实不能办理多线程的成绩。由于,如许固然可使对实例变量的操纵代码举行同步,但其实不能制止一个线程利用别的一个线程修正后的“脏的”实例变量。以是,除下降运转效力外,不会起到预期效果。



由于这些智能化家电的市场需求没有预期的高,Sun放弃了该项计划。就在Oak几近失败之时,随着互联网的发展,Sun看到了Oak在计算机网络上的广阔应用前景,于是改造了Oak,

再现理想 发表于 2015-1-21 12:29:32

Java自面世后就非常流行,发展迅速,对C++语言形成了有力冲击。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台

山那边是海 发表于 2015-1-22 18:42:58

Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、ServerSocket等。Java的RMI(远程方法激活)机制也是开发分布式应用的重要手段。

乐观 发表于 2015-1-26 21:32:18

你就该学一学Servlet了。Servlet就是服务器端小程序,他负责生成发送给客户端的HTML文件。JSP在执行时,也是先转换成Servlet再运行的。虽说JSP理论上可以完全取代Servlet,这也是SUN推出JSP的本意,可是Servlet用来控制流程跳转还是挺方便的,也令程序更清晰。接下来你应该学习一下Javabean了,可能你早就看不管JSP在HTML中嵌Java代码的混乱方式了,这种方式跟ASP又有什么区别呢?

若天明 发表于 2015-1-31 15:30:56

你快去找一份Java的编程工作来做吧(如果是在校学生可以去做兼职啊),在实践中提高自己,那才是最快的。不过你得祈祷在公司里碰到一个高手,而且他 还愿意不厌其烦地教你,这样好象有点难哦!还有一个办法就是读开放源码的程序了。我们知道开放源码大都出自高手,他们设计合理,考虑周到,再加上有广大的程序员参与,代码的价值自然是字字珠叽,铿锵有力(对不起,偶最近《金装四大才子》看多了)。

飘灵儿 发表于 2015-2-6 19:58:04

所以现在应用最广泛又最好学的就是J2EE了。 J2EE又包括许多组件,如Jsp,Servlet,JavaBean,EJB,JDBC,JavaMail等。要学习起来可不是一两天的事。那么又该如何学习J2EE呢?当然Java语法得先看一看的,I/O包,Util包,Lang包你都熟悉了吗?然后再从JSP学起。

若相依 发表于 2015-2-10 23:26:46

你快去找一份Java的编程工作来做吧(如果是在校学生可以去做兼职啊),在实践中提高自己,那才是最快的。不过你得祈祷在公司里碰到一个高手,而且他 还愿意不厌其烦地教你,这样好象有点难哦!还有一个办法就是读开放源码的程序了。我们知道开放源码大都出自高手,他们设计合理,考虑周到,再加上有广大的程序员参与,代码的价值自然是字字珠叽,铿锵有力(对不起,偶最近《金装四大才子》看多了)。

愤怒的大鸟 发表于 2015-3-1 04:14:11

你可以去承接一些项目做了,一开始可能有些困难,可是你有技术积累,又考虑周全,接下项目来可以迅速作完,相信大家以后都会来找你的,所以Money就哗啦啦的。。。。。。

仓酷云 发表于 2015-3-4 10:28:43

所以现在应用最广泛又最好学的就是J2EE了。 J2EE又包括许多组件,如Jsp,Servlet,JavaBean,EJB,JDBC,JavaMail等。要学习起来可不是一两天的事。那么又该如何学习J2EE呢?当然Java语法得先看一看的,I/O包,Util包,Lang包你都熟悉了吗?然后再从JSP学起。

海妖 发表于 2015-3-7 02:11:18

Java是一种计算机编程语言,拥有跨平台、面向对java

只想知道 发表于 2015-3-7 08:10:21

有时间再研究一下MVC结构(把Model-View-Control分离开的设计思想)

不帅 发表于 2015-3-14 14:58:04

学Java必读的两个开源程序就是Jive和Pet Store.。 Jive是国外一个非常著名的BBS程序,完全开放源码。论坛的设计采用了很多先进的技术,如Cache、用户认证、Filter、XML等,而且论坛完全屏蔽了对数据库的访问,可以很轻易的在不同数据库中移植。论坛还有方便的安装和管理程序,这是我们平时编程时容易忽略的一部份(中国程序员一般只注重编程的技术含量,却完全不考虑用户的感受,这就是我们与国外软件的差距所在)。

柔情似水 发表于 2015-3-14 17:06:56

Jive的资料在很多网站上都有,大家可以找来研究一下。相信你读完代码后,会有脱胎换骨的感觉。遗憾的是Jive从2.5以后就不再无条件的开放源代码,同时有licence限制。不过幸好还有中国一流的Java程序员关注它,外国人不开源了,中国人就不能开源吗?这里向大家推荐一个汉化的Jive版本—J道。Jive(J道版)是由中国Java界大名 鼎鼎的banq在Jive 2.1版本基础上改编而成, 全中文,增加了一些实用功能,如贴图,用户头像和用户资料查询等,而且有一个开发团队在不断升级。你可以访问banq的网站

蒙在股里 发表于 2015-3-20 05:21:32

如果要向java web方向发展也要吧看看《Java web从入门到精通》学完再到《Struts2.0入门到精通》这样你差不多就把代码给学完了。有兴趣可以看一些设计模块和框架的包等等。

金色的骷髅 发表于 2015-3-24 18:48:23

是一种由美国SUN计算机公司(Sun Microsystems, Inc.)所研究而成的语言

冷月葬花魂 发表于 2015-4-3 05:38:12

一般学编程语言都是从C语开始学的,我也不例外,但还是可能不学过程语言而直接学面向对象语言的,你是刚接触语言,还是从C开始学比较好,基础会很深点,如果你直接学习JAVA也能上手,一般大家在学语言的时候都记一些语言的关键词,常有的包和接口等。再去做逻辑代码的编写,以后的学习过程都是从逻辑代码编写中提升的,所以这方面都是经验积累的。你要开始学习就从

精灵巫婆 发表于 2015-4-6 17:15:06

是一种使网页(Web Page)产生生动活泼画面的语言

因胸联盟 发表于 2015-4-6 21:15:38

科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。

小女巫 发表于 2015-4-12 05:36:01

你一定会高兴地说,哈哈,原来成为Java高手就这么简单啊!记得Tomjava也曾碰到过一个项目经理,号称Java很简单,只要三个月就可以学会。

admin 发表于 2015-4-16 20:11:24

任职于太阳微系统的詹姆斯·高斯林等人于1990年代初开发Java语言的雏形,最初被命名为Oak,目标设置在家用电器等小型系统的程序语言
页: [1]
查看完整版本: JAVA网页设计Servlet及JSP中的多线程同步成绩