首页 > 其他分享 >你能证明Servlet线程不安全吗?

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

时间:2022-10-31 12:34:52浏览次数:43  
标签:web 证明 安全 线程 message Servlet out


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的值给冲掉了。如下图
 

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

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

 

标签:web,证明,安全,线程,message,Servlet,out
From: https://blog.51cto.com/u_10957019/5809091

相关文章

  • 秋招面试:如何证明Servlet是单例的?
    今天和大家分享一个经典的面试题:如何证明Servlet是单例的?Servlet一般都是单例的,并且是多线程的。如何证明Servlet是单例模式呢?很简单,重写Servlet的init方法,或者添加一个构......
  • 面试题:如何让Servlet变成多例?
    方法1.实现 SingleThreadModel接口(不推荐,官方已经将这个接口废弃)publicclassMyServletextendsHttpServletimplementsSingleThreadModel{publicMyServlet(){......
  • 什么是线程,进程?
    一、线程的基本概念线程是进程中执行运算的最小单位,是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它......
  • Java多线程Thread详细讲解(万字教程)
    一、线程的基本概念线程是进程中执行运算的最小单位,是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它......
  • 浅谈Java多线程之FutureTask
    Runnable和Callable是多线程中的两个任务接口,实现接口的类将拥有多线程的功能,FutureTask类与这两个类是息息相关!FutureTask继承体系看下这张图,原来FutureTask类实现了Runnab......
  • mysql主从复制三个线程
    mysql主从同步很慢查看是io还是sql经过分析,业务那边在删除一个大表数据,从库单线程处理不过来,且io性能也比较低,造成堆积[mysql@mysql192-168-0-36/data/mysqldata1/relaylog......
  • 守护线程
    守护线程一、守护线程定义:setDaemon:将线程声明为守护线程,必须在start()方法调用之前设置,如果不设置为守护线程程序会被无限挂起。这个方法基本和join是相反的。当我们在......
  • Java多线程(6):锁与AQS(下)
    您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来~ 之前说过,AQS(抽象队列同步器)是Java锁机制的底层实现。既然它这么优秀,是骡子是马,就拉出来溜溜吧。首先用重入锁来实现简......
  • 进程与线程
    进程概念被执行的程序的实例就是一个进程(类似docker的镜像与容器)每个进程拥有它自己的虚拟CPU。当然,实际上真正的CPU在各进程之间来回切换。但为了理解这种系统,考虑在......
  • Servlet
    CookieCookie定义:Cookies是存储在客户端计算机上的文本文件,并保留了各种跟踪信息。JavaServlet显然支持HTTPCookies。Cookie,有时也用其复数形式Cookies。类型为......