当前位置: 首页 >> 基本常识
Servlet是线程安全的吗?被面试官问到崩溃
  
  来源: www.zecaviana.com 点击:817

今天所有人都分享了Java选择的面试问题

Servlet不是线程安全的。

要解释servlet不是线程安全的原因,您需要了解servlet容器(即Tomcat)如何响应HTTP请求。

当Tomcat从客户端收到HTTP请求时,Tomcat从线程池中获取一个线程,找到与该请求对应的Servlet对象并初始化它,然后调用service()方法。应该注意的是,每个Servlet对象在Tomcat容器中只有一个实例对象,这是单例模式。如果多个HTTP请求是针对同一个servlet的,那么与这两个HTTP请求相对应的线程将同时调用servlet的service()方法。

上图中的Thread1和Thread2调用相同的Servlet1,因此如果在Servlet1中定义Instances或静态变量,可能会发生线程安全问题(因为所有线程都可能使用这些变量)。

例如,以下servlet中的name和i变量将导致线程安全问题。

导入javax.servlet.ServletException;

导入javax.servlet.http.HttpServlet;

导入javax.servlet.http.HttpServletRequest;

导入javax.servlet.http.HttpServletResponse;

导入java.io.IOException;

导入java.text.SimpleDateFormat;

导入java.util.Date;

公共类ThreadSafeServlet扩展了HttpServlet {

Public static String name='Hello'; //静态变量,可能会发生线程安全问题

Int i; //可能会出现实例变量,线程安全问题

SimpleDateFormat format=new SimpleDateFormat('yyyy-MM-dd hh: mm: ss');

http://www.tongchuangjt.com.cn

友情链接:
尚志门户网 版权所有© www.zecaviana.com 技术支持:尚志门户网 | 网站地图