IT兄弟连 JavaWeb教程 Servlet线程安全问题
2019独角兽企业重金招聘Python工程师标准>>>
在Internet中,一个Web应用可能被来自西面八方的客户并发访问(即同时访问),而且有可能这些客户并发访问的是Web应用中的同一个Servlet,Servlet容器为了保证能同时相应多个客户端要求访问的同一个Servlet的HTTP请求,通常会为每个请求分配一个工作线程,这些工作线程并发执行同一个Servlet对象的service()方法。
当多个线程并发执行同一个Servlet对象的service()方法时,可能会导致并发问题。
例:下面的案例用于演示导致并发问题的情形。
public class HelloServlet extends HttpServlet{
public void service(HttpServletRequest request,
HttpServletResponse response)throws ServletException,IOException{
private String username = null;
username = request.getParameter("username");
if(username != null){
username = new String(username.getBytes("ISO-8859-1"),"utf-8");
}
try{
Thread.sleep(3000);
}catch(Exception e){
e.printStackTrace();
}
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.println("您好:" + username);
out.close();
}
}
在HelloServlet中有一个实例变量username,在HelloServlet的service()方法中,先将username请求参数赋值给实例变量username,最后再向客户端返回实例变量username的值,为了延长响应客户请求的时间,在service()方法中调用Thread.sleep(3000)方法睡眠3秒。
在web.xml文件中为HelloServlet映射的URL为"/hello"。同时打开两个浏览器,分别输入如下URL:
http://localhost:8080/helloapp/hello?username=老鼠
http://localhost:8080/helloapp/hello?username=小鸭
以上两个浏览器并发访问HelloServlet,出现了奇怪的现象。在第一个浏览器中,虽然客户端提供的请求参数username的值为"老鼠",HelloServlet却返回"您好:小鸭"。为什么一眨眼,老鼠就变成了鸭呢?
下面在看另一个案例:
public class AdderServlet extends HttpServlet{
public void service(HttpServletRequest request,
HttpServletResponse response)throws ServletException,IOException{
private int sum = 100;
int increase = Integer.parseInt(request.getParameter("increase"));
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.println(sum + "+" + increase + "=");
try{
Thread.sleep(3000);
}catch(Exception e){
e.printStackTrace();
}
sum+=increase;
out.println("sum");
out.close();
}
}
在AdderServlet中有一个实例变量sum,在AdderServlet的service()方法中提取increase请求参数,再把实例变量sum加上increase,最后再向客户端返回实例变量sum的值。为了延长响应客户请求的时间,在service()方法中调用Thread.sleep(3000)方法睡眠3秒钟。
在web.xml文件中为AdderServlet映射的URL为"/adder"。同时打开两个浏览器,分别输入如下URL:
http://localhost:8080/helloapp/adder?increase=100
http://localhost:8080/helloapp/adder?increase=200
两个浏览器并发访问AdderServlet,出现了奇怪的现象。在第二个浏览器中,客户端提供的请求参数increase的值为"200",AdderServlet返回"100+200=400",AdderServlet所做的加法运算显然是错误的。
在解决并发问题时,主要遵循以下原则:
● 根据实际应用需求,合理决定在Servlet中定义的变量的作用于。变量到底为实例变量,还是局部变量,是由实际应用需求决定的。
● 对于多个线程同时访问共享数据而导致并发问题的情况,使用Java同步机制对线程进行同步。
● 不提倡使用被废弃的javax.servlet.SingleThreadModel接口。
转载于:https://my.oschina.net/u/4125915/blog/3047832
IT兄弟连 JavaWeb教程 Servlet线程安全问题相关推荐
- java web 请求跟踪_IT兄弟连 JavaWeb教程 Servlet会话跟踪 Cookie技术
原标题:IT兄弟连 JavaWeb教程 Servlet会话跟踪 Cookie技术 Cookie使用HTTPHeader传递数据.Cookie机制定义了两种报头,Set-Cookie报头和Cookie报 ...
- IT兄弟连 JavaWeb教程 Servlet转发
2019独角兽企业重金招聘Python工程师标准>>> Servlet对象由Servlet容器创建,并且Servlet对象的service()方法也由容器调用,一个Servlet对象 ...
- Servlet功能实现和执行过程、servlet的生命周期、Servlet线程安全问题、Servlet的三种映射方式、ServletConfig、ServletContext
1. 什么是Servlet? Servlet是SUN公司提供的一套规范,名称就叫Servlet规范,它也是JavaEE规范之一. 第一:Servlet是一个运行在web服务端的java小程序 第二:它 ...
- IT兄弟连 JavaWeb教程 使用Servlet实现在页面中显示随机数
在com.xdl.servlet包下定义RandomServlet类并HttpServlet类,在该类中生成随机数并发送给客户端.RandomServlet类详细代码如下: package com.x ...
- IT兄弟连 JavaWeb教程 监听器3
2019独角兽企业重金招聘Python工程师标准>>> 监听域对象中属性变更的监听器 域对象中属性的变更的事件监听器就是用来监听ServletContext.HttpSession. ...
- IT兄弟连 JavaWeb教程 MVC设计模式
MVC是Model-View-Controller的简称,即模型-视图-控制器.MVC是一种设计模式,它强制性地把应用程序的数据展示.数据处理和流程控制分开.MVC把应用程序分成3个核心模块:模型.视 ...
- IT兄弟连 JavaWeb教程 文件下载技术
● 列出提供下载的文件资源 我们要将Web应用系统中的文件资源提供给用户进行下载,首先我们要有一个页面列出上传文件目录下的所有文件,当用户点击文件下载超链接时就进行下载操作,编写一个ListFile ...
- IT兄弟连 JavaWeb教程 JSON和JSON字符串
2019独角兽企业重金招聘Python工程师标准>>> JSON (JavaScript Object Notation)是JavaScript语言中的一种对象类型.JSON的好处是 ...
- IT兄弟连 JavaWeb教程 jQuery对AJAX的支持经典案例
案例需求:编写用户登陆页面的验证码模块,在用户进行登陆时,输入验证码后不需要点击提交按钮,使用AJAX异步地向服务器发送验证验证码的请求.如果验证码正确,可以点击提交按钮,如果验证码输入错误,提示用户 ...
最新文章
- Apache CXF实现WebService发布和调用
- vSAN架构解析与6.7功能介绍
- 定制MyBatis的日志
- WPF的5种绑定模式(mode)
- IP的正则表达式 IP地址的正则表达式写法
- 数据分析有 AI 帮你,Sugar BI 智能分析全场景介绍
- 银广夏事件--中国股票财务作假事件
- HTML5、css3、js实现3D相册
- 在 Web 浏览器上进行 RSS 阅读
- 小米4降级android版本,小米MIUI不再允许降级,小心手机变砖
- 鞍点Saddle Point Locator
- 【Linux】【开发环境】【RHEL】开发环境搭建系列之四——安装daytime服务
- 思科模拟器实验6:rip基础配置
- 人生路上前进的方向----有几条线贯穿自己的人生
- vue开发web端实现列表左右联动效果
- 【Python学习笔记】- 06 函数式编程
- 分支合并-rebase
- 拼多多收php吗_php调用拼多多的接口
- Nginx+mongrel部署Rails应用
- Vue整合ElementUI,组件使用教程,适合新手
热门文章
- python rabitmq_3、Python结合RabbitMQ实现消息传递
- 到目前为止,Linux下最完整的Samba服务器配置攻略
- 利用Kafka发送/消费消息-Java示例
- 【已解决】运行Eclipse出错:Failed to load the JNI shared library
- Lua基础篇-1 :什么是 Lua 语言?
- SearchView去除下划线
- 温故而知新 Ajax 的新坑 dataType: 'json'
- Slog15_支配vue框架模版语法之v-else
- MySQL一主二从复制环境切换主从库
- zabbix分布式监控环境搭建