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