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线程安全问题相关推荐

  1. java web 请求跟踪_IT兄弟连 JavaWeb教程 Servlet会话跟踪 Cookie技术

    原标题:IT兄弟连 JavaWeb教程 Servlet会话跟踪 Cookie技术 Cookie使用HTTPHeader传递数据.Cookie机制定义了两种报头,Set-Cookie报头和Cookie报 ...

  2. IT兄弟连 JavaWeb教程 Servlet转发

    2019独角兽企业重金招聘Python工程师标准>>> Servlet对象由Servlet容器创建,并且Servlet对象的service()方法也由容器调用,一个Servlet对象 ...

  3. Servlet功能实现和执行过程、servlet的生命周期、Servlet线程安全问题、Servlet的三种映射方式、ServletConfig、ServletContext

    1. 什么是Servlet? Servlet是SUN公司提供的一套规范,名称就叫Servlet规范,它也是JavaEE规范之一. 第一:Servlet是一个运行在web服务端的java小程序 第二:它 ...

  4. IT兄弟连 JavaWeb教程 使用Servlet实现在页面中显示随机数

    在com.xdl.servlet包下定义RandomServlet类并HttpServlet类,在该类中生成随机数并发送给客户端.RandomServlet类详细代码如下: package com.x ...

  5. IT兄弟连 JavaWeb教程 监听器3

    2019独角兽企业重金招聘Python工程师标准>>> 监听域对象中属性变更的监听器 域对象中属性的变更的事件监听器就是用来监听ServletContext.HttpSession. ...

  6. IT兄弟连 JavaWeb教程 MVC设计模式

    MVC是Model-View-Controller的简称,即模型-视图-控制器.MVC是一种设计模式,它强制性地把应用程序的数据展示.数据处理和流程控制分开.MVC把应用程序分成3个核心模块:模型.视 ...

  7. IT兄弟连 JavaWeb教程 文件下载技术

    ●  列出提供下载的文件资源 我们要将Web应用系统中的文件资源提供给用户进行下载,首先我们要有一个页面列出上传文件目录下的所有文件,当用户点击文件下载超链接时就进行下载操作,编写一个ListFile ...

  8. IT兄弟连 JavaWeb教程 JSON和JSON字符串

    2019独角兽企业重金招聘Python工程师标准>>> JSON (JavaScript Object Notation)是JavaScript语言中的一种对象类型.JSON的好处是 ...

  9. IT兄弟连 JavaWeb教程 jQuery对AJAX的支持经典案例

    案例需求:编写用户登陆页面的验证码模块,在用户进行登陆时,输入验证码后不需要点击提交按钮,使用AJAX异步地向服务器发送验证验证码的请求.如果验证码正确,可以点击提交按钮,如果验证码输入错误,提示用户 ...

最新文章

  1. Apache CXF实现WebService发布和调用
  2. vSAN架构解析与6.7功能介绍
  3. 定制MyBatis的日志
  4. WPF的5种绑定模式(mode)
  5. IP的正则表达式 IP地址的正则表达式写法
  6. 数据分析有 AI 帮你,Sugar BI 智能分析全场景介绍
  7. 银广夏事件--中国股票财务作假事件
  8. HTML5、css3、js实现3D相册
  9. 在 Web 浏览器上进行 RSS 阅读
  10. 小米4降级android版本,小米MIUI不再允许降级,小心手机变砖
  11. 鞍点Saddle Point Locator
  12. 【Linux】【开发环境】【RHEL】开发环境搭建系列之四——安装daytime服务
  13. 思科模拟器实验6:rip基础配置
  14. 人生路上前进的方向----有几条线贯穿自己的人生
  15. vue开发web端实现列表左右联动效果
  16. 【Python学习笔记】- 06 函数式编程
  17. 分支合并-rebase
  18. 拼多多收php吗_php调用拼多多的接口
  19. Nginx+mongrel部署Rails应用
  20. Vue整合ElementUI,组件使用教程,适合新手

热门文章

  1. python rabitmq_3、Python结合RabbitMQ实现消息传递
  2. 到目前为止,Linux下最完整的Samba服务器配置攻略
  3. 利用Kafka发送/消费消息-Java示例
  4. 【已解决】运行Eclipse出错:Failed to load the JNI shared library
  5. Lua基础篇-1 :什么是 Lua 语言?
  6. SearchView去除下划线
  7. 温故而知新 Ajax 的新坑 dataType: 'json'
  8. Slog15_支配vue框架模版语法之v-else
  9. MySQL一主二从复制环境切换主从库
  10. zabbix分布式监控环境搭建