美文网首页java Web
Servlet是线程安全的吗?被面试官问到崩溃

Servlet是线程安全的吗?被面试官问到崩溃

作者: 架构师Javaspring | 来源:发表于2019-07-21 17:52 被阅读0次

Servlet不是线程安全的。

要解释为什么Servlet为什么不是线程安全的,需要了解Servlet容器(即Tomcat)使如何响应HTTP请求的。

当Tomcat接收到Client的HTTP请求时,Tomcat从线程池中取出一个线程,之后找到该请求对应的Servlet对象并进行初始化,之后调用service()方法。要注意的是每一个Servlet对象再Tomcat容器中只有一个实例对象,即是单例模式。如果多个HTTP请求请求的是同一个Servlet,那么着两个HTTP请求对应的线程将并发调用Servlet的service()方法。

上图中的Thread1和Thread2调用了同一个Servlet1,所以此时如果Servlet1中定义了实例变量或静态变量,那么可能会发生线程安全问题(因为所有的线程都可能使用这些变量)。

比如下面的Servlet中的 name 和 i变量就会引发线程安全问题。

importjavax.servlet.ServletException;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importjava.io.IOException;importjava.text.SimpleDateFormat;importjava.util.Date;publicclassThreadSafeServletextendsHttpServlet{publicstaticString name ="Hello";//静态变量,可能发生线程安全问题int i;//实例变量,可能发生线程安全问题SimpleDateFormat format =newSimpleDateFormat("yyyy-MM-dd hh:mm:ss"); @Overridepublicvoidinit() throws ServletException {super.init(); System.out.println("Servlet初始化"); } @Overrideprotectedvoidservice(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.printf("%s:%s[%s]\n", Thread.currentThread().getName(), i, format.format(newDate())); i++;try{ Thread.sleep(5000); }catch(InterruptedException e) { e.printStackTrace(); } System.out.printf("%s:%s[%s]\n", Thread.currentThread().getName(), i, format.format(newDate())); resp.getWriter().println("<html><body><h1>"+ i +"</h1></body></html>"); }}

在Tomcat中启动这个Servlet并在浏览器发起多个HTTP访问,最后会发现变量 i 是多线程共享的。

感谢你看完文章,小编最近收藏了一大波各大BAT面试真题资料,免费送给正在找工作的你或者想换工作的你,加q:2735398787 欢迎自取

相关文章

  • Servlet是线程安全的吗?被面试官问到崩溃

    Servlet不是线程安全的。 要解释为什么Servlet为什么不是线程安全的,需要了解Servlet容器(即To...

  • servlet是线程安全的吗?

    Servlet不是线程安全的。多线程访问同一个资源,可能造成线程的不安全. 什么是线程安全? 如果你的代码所在的进...

  • Servlet 是线程安全的吗?

    概要 Servlet 默认是单例模式,在web 容器中只创建一个实例,所以多个线程同时访问servlet的时候,S...

  • Servlet-08(Servlet小结)

    1.Servlet线程安全问题 (1)为什么说Servlet会有线程安全问题? a. 容器对于某个servlet,...

  • servlet 笔记

    servlet servlet 声明周期 Servlet 的线程安全 Servlet 获取配置信息 Servlet...

  • ArrayList为什么是线程不安全的?

    一、概述 面试时相信面试官首先就会问到关于它的知识。一个经常被问到的问题就是:ArrayList是否是线程安全的?...

  • servlet

    1.Java面试题:Servlet是线程安全的吗? https://www.cnblogs.com/chanshu...

  • 什么叫线程安全?servlet是线程安全吗?

    线程安全是编程中的术语,指某个函数、函数库在多线程环境中被调用时,能够正确地处理多个线程之间的共享变量,使程序功能...

  • 2020-12-31String StringBuffer St

    面试经常会问到这个问题。就做个总结吧。 线程安全问题:StringBuffer是线程安全得 为什么线程安全 因为它...

  • hashmap原理浅谈

    昨天面试的时候,面试官从线程安全的集合开始问起,然后顺便问到了hashMap的实现原理。因为之前一直不注...

网友评论

    本文标题:Servlet是线程安全的吗?被面试官问到崩溃

    本文链接:https://www.haomeiwen.com/subject/takvlctx.html