深化研究Servlet线程安全性问题[Java编程]
本文“深化研究Servlet线程安全性问题[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
择要:介绍了Servlet多线程机制,通过一个实例并结合Java 的内存模子阐明惹起Servlet线程不安全的缘由,给出了保证Servlet线程安全的三种办理筹划,并阐明三种筹划在实际开辟中的取舍.
关键字:Servlet 线程安全 同步 Java内存模子 实例变量
Servlet/JSP技术和ASP、PHP等相比,由于其多线程运行而具有很高的履行效率.由于Servlet/JSP默许是以多线程情势履行的,所以,在编写代码时需求非常具体地考虑多线程的安全性问题.但是,很多人编写Servlet/JSP程序时并没有注意到多线程安全性的问题,这常常造成编写的程序在少量用户拜候时没有任何问题,而在并发用户上升到一定值时,就会常常呈现一些莫明其妙的问题.
Servlet的多线程机制
Servlet体系构造是成立在Java多线程机制之上的,它的生命周期是由Web容器负责的.当客户端第一次恳求某个Servlet时,Servlet容器将会按照web.xml配置文件实例化这个Servlet类.当有新的客户端恳求该Servlet时,普通不会再实例化该Servlet类,也就是有多个线程在利用这个实例.Servlet容器会自动利用线程池等技术来支持系统的运行,如图1所示.
图1 Servlet线程池
这样,当两个或多个线程同时拜候同一个Servlet时,大概会发生多个线程同时拜候同一资源的情形,数据大概会变得不一致.所以在用Servlet构建的Web利用时假如不注意线程安全的问题,会使所写的Servlet程序有难以发现的错误.
Servlet的线程安全问题
Servlet的线程安全问题主如果由于实例变量利用不当而惹起的,这里以一个实际的例子来阐明.
Import javax.servlet. *;
Import javax.servlet.http. *;
Import java.io. *;
Public class Concurrent Test extends HttpServlet {PrintWriter output;
Public void service (HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {String username;
Response.setContentType ("text/html; charset=gb2312");
Username = request.getParameter ("username");
Output = response.getWriter ();
Try {Thread. sleep (5000); //为了突出并发问题,在这设置一个延时
} Catch (Interrupted Exception e){}
output.println("用户名:"+Username+"<BR>");
}
}
该Servlet中定义了一个实例变量output,在service办法将其赋值为用户的输出.当一个用户拜候该Servlet时,程序会正常的运行,但当多个用户并发拜候时,便大概会呈现别的用户的信息显示在别的一些用户的浏览器上的问题.这是一个严重的问题.为了突出并发问题,便于测试、察看,我们在回显用户信息时履行了一个延时的操作.假定已在web.xml配置文件中注册了该Servlet,现有两个用户a和b同时拜候该Servlet(可以启动两个IE浏览器,大概在两台机械上同时拜候),即同时在浏览器中输入:
a: http://localhost: 8080/servlet/ConcurrentTest? Username=a
b: http://localhost: 8080/servlet/ConcurrentTest? Username=b
假如用户b比用户a回车的时间稍慢一点,将得到如图2所示的输出:
图2 a用户和b用户的浏览器输出
以上是“深化研究Servlet线程安全性问题[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |