Servlet基础(三) Servlet的多线程同步问题
Servlet基础(三) Servlet的多线程同步问题
Servlet/JSP技术和ASP、PHP等相比,由于其多线程运行而具有很高的执行效率。
由于Servlet/JSP默认是以多线程模式执行的,所以,在编写代码时需要非常细致地考虑多线程的同步问题。
如果在编写Servlet/JSP程序时不注意到多线程的同步问题,这往往造成程序在少量用户访问时没有任何问题,而在并发用户上升到一定值时,就会经常出现一些莫名其妙的问题,对于这类随机性的问题调试难度也很大。
比如下面这个程序就有问题。
存在多线程问题的程序例子
这个例子中,首先有一个JSP页面,其中有一个简单的表单:
<form action="MultiThreadServlet">
<input type="text" name="username">
<input type="submit" value="submit">
</form>
提交表单后,转向一个Servlet进行处理:
获取请求中的参数,并且调用setAttribute方法将其值存储,转向下一个jsp页面:
package com.shengqishiwind.servlet; import java.io.IOException;
import java.io.PrintWriter; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class MultiThreadServlet extends HttpServlet
{
//使用成员变量
private String username; public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
//从请求中得到参数,即用户名
username = request.getParameter("username"); //得到当前线程的名字
System.out.println("Thread Name: " + Thread.currentThread().getName()); //模拟一些后端的业务处理
try
{ Thread.sleep(10000);
}
catch (Exception e)
{
e.printStackTrace();
} request.setAttribute("username", username);
//请求转发
request.getRequestDispatcher("hello.jsp").forward(request, response); } }
中间让线程停留了10秒钟,来模拟一些操作。
在下一个JSP页面中将该值显示出来:
<body>
username: <%= request.getAttribute("username")%>
</body>
这样做有什么问题呢?
打开浏览器,输入访问地址后,输入一个用户名zhangsan,再打开一个窗口,输入用户名lisi。
两个浏览器窗口都提交以后,过了一定时间,可以看到两边返回值都是lisi。
问题原因
Servlet的多线程同步问题:
Servlet本身是单实例的,这样当有多个用户同时访问某个Servlet时,会访问该唯一的Servlet实例中的成员变量,如果对成员变量进行写入操作,那就会导致Servlet的多线程问题,即数据不一致。
解决同步问题的方案
1.解决Servlet多线程同步问题的最好方式:
去除实例变量,使用局部变量。
比如上面那个例子修改如下:
public class MultiThreadServlet extends HttpServlet
{
//使用成员变量
//private String username; public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
//从请求中得到参数,即用户名
String username = request.getParameter("username"); //得到当前线程的名字
System.out.println("Thread Name: " + Thread.currentThread().getName()); //模拟一些后端的业务处理
try
{ Thread.sleep(10000);
}
catch (Exception e)
{
e.printStackTrace();
} request.setAttribute("username", username);
//请求转发
request.getRequestDispatcher("hello.jsp").forward(request, response); } }
不使用成员变量,而使用局部变量,因为局部变量在每个线程中都有各自的实例。
所以对Servlet来说,如果要对某个变量做写入操作,一定不要使用成员变量,而要使用局部变量。
2.使用同步代码块
synchronized{}
3.Servlet实现javax.serlvet.SingleThreadModel(Servlet2.4中已经废弃了该接口),此时Servlet容器将保证Servlet实例以单线程方式运行,也就是说,同一时刻,只会有一个线程执行Servlet的service()方法。
(这种方式了解一下就行了)。
参考资料
圣思园张龙老师Java Web视频教程。
Servlet基础(三) Servlet的多线程同步问题的更多相关文章
- Java第三阶段学习(十一、Servlet基础、servlet中的方法、servlet的配置、ServletContext对象)
一.Servlet简介 1.什么是servlet: sun公司提供的一套规范(接口),用来处理客户端请求.响应给浏览器的动态资源.但servlet的实质就是java代码,通过java的API动态的向 ...
- servlet多线程同步问题
Servlet/JSP技术和ASP.PHP等相比,由于其多线程运行而具有很高的执行效率.•由于Servlet/JSP默认是以多线程模式执行的,所以,在编写代码时需要非常细致地考虑多线程的同步问题.•如 ...
- 2 Servlet基础
作者:禅楼望月(http://www.cnblogs.com/yaoyinglong) 1. 从浏览器访问Servlet的流程 刚才发现,这里的图片不能正常显示,所以我给个链接,大家可以下载下来看从浏 ...
- Java之JSP和Servlet基础知识
JSP基础 JSP起源 JSP,JavaServer Pager的简称.由SUN倡导并联合其它公司创建. JSP是一门脚本语言 JSP可以嵌入到HTML中 JSP拥有Java语言的所有特性 面向对象. ...
- J2EE基础之Servlet
J2EE基础之Servlet 1. 什么是Servlet? Servlet即Java服务小程序,是使用应用程序设计接口以及相关类和方法的Java程序.它可以作为一种插件,像Applet程序一样嵌入到 ...
- JSP数据交互(二)和Servlet基础
01.Application原理与应用 01.application对象的作用域范围是整个应用服务,而它在应用中所承担的责任就类似于一个全局变量.只要服务启动,则application对象就会存在. ...
- Servlet基础(一) Servlet简介 关键API介绍及结合源码讲解
Servlet基础(一) Servlet基础和关键的API介绍 Servlet简介 Java Servlet是和平台无关的服务器端组件,它运行在Servlet容器中. Servlet容器负责Servl ...
- JavaWeb学习之Servlet(三)----Servlet的映射匹配问题、线程安全问题
[声明] 欢迎转载,但请保留文章原始出处→_→ 文章来源:http://www.cnblogs.com/smyhvae/p/4140529.html 一.Servlet映射匹配问题: 在第一篇文章中的 ...
- JSP/Servlet基础语法
相关学习资料 http://my.oschina.net/chape/blog/170247 http://docs.oracle.com/cd/E13222_01/wls/docs81/webapp ...
随机推荐
- Azure China (7) 使用WebMetrix将Web Site发布至Azure China
<Windows Azure Platform 系列文章目录> 本章介绍的是,使用世纪互联运维的Azure云服务. 1.首先我们登陆Azure管理界面.http://manage.wind ...
- Windows Azure Virtual Machine (31) 迁移Azure虚拟机
<Windows Azure Platform 系列文章目录> 为什么要写这篇Blog? 之前遇到过很多客户提问: (1)我之前创建的虚拟机,没有加入虚拟网络.现在需要重新加入虚拟机网络, ...
- HTTPS协议说明
HTTPS协议说明 基本现在最安全的网络连接就是使用https了,http协议有几个不安全的地方: 传输信息是明文的. -- http的传输信息是明文的,基本网络劫持下就束手就擒了. 不能防止篡改. ...
- 【Swift学习】Swift编程之旅---ARC(二十)
Swift使用自动引用计数(ARC)来跟踪并管理应用使用的内存.大部分情况下,这意味着在Swift语言中,内存管理"仍然工作",不需要自己去考虑内存管理的事情.当实例不再被使用时, ...
- VS自动生成的packages.config配置文件有什么用?
通过nuget管理安装了程序包之后,Visual Studio会自动生成一个关于这些程序包版本的配置文件,删除或者保留它对程序不会造成什么影响.
- 【WebService】WebService的创建和使用——文件名称生成器
简介 之前做过一个文件名称生成器,通过Webservice读取XML文件并将其通过Json传到客户端中的combobx,用户通过combobox选择要生成文件的名称模板,点击生成则会产生一个文件名称并 ...
- WCF双工通讯以及客户端间的间接通讯
由于学习计划安排不当,对WCF的认知一直停滞不前,最近工作上又用回了WCF,重拾一下,看到蒋老师介绍双工通讯的博文,实践一下,积累一下.原想着WCF的双工通讯就是原本的客户端能调用服务端的方法之余,服 ...
- Ext.NET 4.1 系统框架的搭建(后台) 附源码
Ext.NET 4.1 系统框架的搭建(后台) 附源码 代码运行环境:.net 4.5 VS2013 (代码可直接编译运行) 预览图: 分析图: 上面系统的构建包括三块区域:North.West和C ...
- OC基础数据类型-NSData-NSMutableData-NSString
NSData和NSMutableData存储的是二进制数据,在文件操作,网络,以及核心图形图像中使用较广泛.NSData创建后不可以再修改,NSMutableData可以再次修改. 1.NSStrin ...
- 使用MySQL WorkBench导出数据库
1. 在MySQL WorkBench的Server Administrator中双击要连接的数据库: 2. 点击左边的Data Export,在右边的数据库列表中选择要导出的数据库: 3. Expo ...