你能证明Servlet线程不安全吗?

简介: 你能证明Servlet线程不安全吗?

Servlet默认是线程不安全的!

Servlet体系结构是建立在Java多线程机制之上的,它的生命周期是由Web容器负责的。


当客户端第一次请求某个Servlet时,Servlet容器将会根据web.xml配置文件实例化这个Servlet类。


当有新的客户端请求该Servlet时,一般不会再实例化该Servlet类,也就是有多个线程在使用这个实例。


Servlet容器会自动使用线程池等技术来支持系统的运行。


当两个或多个线程同时访问同一个Servlet时,可能会发生多个线程同时访问同一资源的情况,数据可能会变得不一致。


所以在用Servlet构建的Web应用时如果不注意线程安全的问题,会使所写的Servlet程序有难以发现的错误。


下面举一个例子来说明,为什么Servlet是线程不安全的。

public class MyServlet extends HttpServlet{
  String message;
  @Override
  protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    message = req.getParameter("message");
    PrintWriter out = resp.getWriter();
    //故意延时5秒钟,使得下一次请求过来的时候,message的值还没有返回就被覆盖了
    try {
      Thread.sleep(5000);
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
    out.write(message);
    out.flush();
    out.close();
  }
}

打开两个浏览器,分别访问:


http://localhost:8080/web/hello?message=jack


http://localhost:8080/web/hello?message=rose


因为有5秒的延时,所以可能就会出现第一个Servlet还没返回呢,第二个Servlet就进来了。于是,把message的值给冲掉了。如下图


64.png

石锤了,Servlet是线程不安全的。

相关文章
|
2月前
|
缓存 安全 Java
为什么全局变量可能成为多线程环境中的安全隐患
为什么全局变量可能成为多线程环境中的安全隐患
|
4月前
|
安全 Java
JAVA 线程安全
【1月更文挑战第4天】JAVA 线程安全
|
6月前
|
安全 Java
并发编程系列教程(02) - 多线程安全
并发编程系列教程(02) - 多线程安全
16 0
|
6月前
|
监控 安全 算法
Thread入门与线程方法详解及多线程安全
Thread入门与线程方法详解及多线程安全
22 0
|
3月前
|
安全 Java 开发者
丢失的8小时去哪里了?SimpleDateFormat线程不安全,多线程初始化异常解决方案
丢失的8小时去哪里了?SimpleDateFormat线程不安全,多线程初始化异常解决方案
38 0
|
8月前
|
安全 算法 Java
去某东面试遇到并发编程问题:如何安全地中断一个正在运行的线程
一个位5年的小伙伴去某东面试被一道并发编程的面试题给Pass了,说”如何中断一个正在运行中的线程?,这个问题很多工作2年的都知道,实在是有些遗憾。 今天,我给大家来分享一下我的回答。
65 0
|
7天前
|
安全 Java 调度
HashMap很美好,但线程不安全怎么办?ConcurrentHashMap告诉你答案!
HashMap很美好,但线程不安全怎么办?ConcurrentHashMap告诉你答案!
27 1
|
14天前
|
存储 安全 Java
Java中的容器,线程安全和线程不安全
Java中的容器,线程安全和线程不安全
16 1
|
5月前
|
存储 安全 Java
Java并发编程学习4-线程封闭和安全发布
本篇介绍 对象的共享之线程封闭和安全发布
63 2
Java并发编程学习4-线程封闭和安全发布
|
3月前
|
存储 安全
除了Lock对象,还有其他方法可以实现多线程安全的单例模式吗?
【2月更文挑战第5天】【2月更文挑战第12篇】除了Lock对象,还有其他方法可以实现多线程安全的单例模式吗?