由于servlet是个线程池,而且是非线程安全,所以当压力过大的时候,容易导致一些奇怪的现象。
如下面的代码
// instanceconcurrenttest.jsp
<%@ page contentType="text/html;charset=GBK" %>
<%!
//定义实例变量
String username;
String password;
java.io.PrintWriter output;
%>
<%
//从request中获取参数
username = request.getParameter("username");
password = request.getParameter("password");
output = response.getWriter();
showUserInfo();
%>
<%!
public void showUserInfo() {
//为了突出并发问题,在这儿首先执行一个费时操作
int i =0;
double sum = 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两个线程的输出
如果是简单的将showUserInfo方法简单的synchronized并不能解决问题。(可以试一下)。
解决问题的办法是给方法中的变量传一个实例进取。
<%!
//定义实例变量
String username;
String password;
java.io.PrintWriter output;
%>
<%
//从request中获取参数
username = request.getParameter("username");
password = request.getParameter("password");
output = response.getWriter();
showUserInfo(username,password,output);
//showUserInfo();
%>
<%!
public void showUserInfo(String user ,String pass,java.io.PrintWriter _output) {
// public void showUserInfo() {
//为了突出并发问题,在这儿首先执行一个费时操作
int i =0;
double sum = 0.0;
while (i++ < 200000000) {
sum += i;
}
_output.println(Thread.currentThread().getName() + "<br>");
_output.println("username:" + user + "<br>");
_output.println("password:" + pass + "<br>");
}
%>
这样就可以解决问题。
但我有点想不明白的是java传参数是传得引用,可是这里如果是引用的话那和上面的代码效果应该一样。所以推断,传得是实例。
问题时解决了,但我不想继续得过且过,不知道我那里想错了,请各位指点。
上面的例子摘自:http://publish.it168.com/2005/1209/20051209002201_hezuo.shtml?cChanNel=11&cpositioncode=296&hezuo=2
分享到:
相关推荐
servlet线程安全问题servlet线程安全问题
jsp传参 servlet接收中文乱码问题的解决方法.docx
servlet与Struts action线程安全问题分析
Java_servlet多线程 Java_servlet多线程
SQL传参Servlet翻页.....................
servlet多线程
在上一篇关于Serlvet框架和Servlet生命周期的学习中,我们已经知道了在多线程的情况下 Servlet是线程不安全的。Servlet体系是建立在java多线程的基础之上的,它的生命周期是由Tomcat 来维护的。当客户端第一次请求...
深入研究Servlet线程安全性问题...
1. 理解servlet的生命周期 知道什么是servlet:运行在服务器端的一个单实例多线程的服务器端Java应用程序(手动的配置servlet) 2. 熟练掌握通过servlet接受参数信息
当两个或多个线程同时访问同一个Servlet时,可能会发生多个线程同时访问同一资源的情况,数据可能会变得不一致,所以就很容易造成一系列的一些安全性问题。
servlet与Struts action线程安全问题分析 <br>===================================================== Servlet的线程安全问题只有在大量的并发访问时才会显现出来,并且很难发现,因此在编写Servlet程序时要...
servlet-api.jar 和jsp-api 工具jar包
下面小编就为大家带来一篇jsp传参 servlet接收中文乱码问题的解决方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
[其他类别]jsp+servlet+javaBean实现MVC_jspmvc[其他类别]jsp+servlet+javaBean实现MVC_jspmvc[其他类别]jsp+servlet+javaBean实现MVC_jspmvc[其他类别]jsp+servlet+javaBean实现MVC_jspmvc[其他类别]jsp+servlet+...
线程安全就是多线程操作同一个对象不会有问题,线程同步一般来保护线程安全, 所以可以在Servlet的线程里面加上同步方法或同步块。 (Synchronized)可以保证在同一时间只有一个线程访问,(使用同步块会导致性能...
[其他类别]jsp+servlet+javaBean实现MVC_jspmvc [其他类别]jsp+servlet+javaBean实现MVC_jspmvc [其他类别]jsp+servlet+javaBean实现MVC_jspmvc [其他类别]jsp+servlet+javaBean实现MVC_jspmvc [其他类别]jsp+...
JSP源码——jsp+servlet+javaBean实现MVC_jspmvc.zip
含有servlet-api.jar和jsp-api.jar文件;解压获得servlet-api.jar和jsp-api.jar文件;需要下载!
Head First Servlet & JSP, 经典教程,适用于SCWCD,我就是用这本书98%通过认证。本人注释版,非扫描。
基于 Servlet+jsp+mysql 开发 javaWeb 学生宿舍管理系统基于 Servlet+jsp+mysql 开发 javaWeb 学生宿舍管理系统基于 Servlet+jsp+mysql 开发 javaWeb 学生宿舍管理系统基于 Servlet+jsp+mysql 开发 javaWeb 学生宿舍...