Servlet是单实例的,系统中的Servlet只会实例化一次,接着每个用户请求都会产生一个线程,注意这里是每个用户请求而不是每个用户,下面测试代码可以说明:
import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @SuppressWarnings("serial") @WebServlet("/MyServlet") public class MyServlet extends HttpServlet { @Override public void init() throws ServletException { super.init(); System.out.println("Servlet初始化线程:"+Thread.currentThread().getName()); } public MyServlet() { System.out.println("Servlet实例化线程:"+Thread.currentThread().getName()); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.getWriter().append("Served at: ").append(request.getContextPath()); System.out.println("用户session:"+request.getSession()); System.out.println("用户线程"+Thread.currentThread().getName()); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }用两个浏览器分别发起请求控制台打印结果如下:
Servlet实例化线程:http-nio-80-exec-2 Servlet初始化线程:http-nio-80-exec-2 用户session:org.apache.catalina.session.StandardSessionFacade@402d3e79 用户线程http-nio-80-exec-2 用户session:org.apache.catalina.session.StandardSessionFacade@605ef7e6 用户线程http-nio-80-exec-4 用户session:org.apache.catalina.session.StandardSessionFacade@605ef7e6 用户线程http-nio-80-exec-7 用户session:org.apache.catalina.session.StandardSessionFacade@402d3e79 用户线程http-nio-80-exec-8可以看出来,servler只会实例化一次,两个用户请求对应两个session,但是多次请求就对应多个线程。
注:测试环境Tomcat9+jdk8