Servlet:单例、单线程或多实例多线程



这个问题以前已经问过了,但是我想进一步问一下。

  1. servlet是单例还是非单例?据我所知,它们只由容器初始化,但它们仍然不是单例的??为什么? ?

  2. servlet是单线程还是多线程(忘记javax.servlet。SingleThreadModel 类)例如,当一个servlet有多个请求时会发生什么?如果它们是并发执行的,这意味着它是多线程的??如果它是多线程的,那么每个线程都会有一个servlet实例,这与第一点相矛盾!!

我认为,每当有新的请求时,容器为传入的请求创建一个新的线程,比如Req1,在这个线程中它调用或分派控制给servlet的服务方法。现在这个执行是并发发生的。我想是这样的……

我的工作站在相同的MVC环境??(例如Struts 1/2, Springs)

只存在一个实例并不意味着它不是多线程。多个线程可以并发地调用同一个实例的同一个方法。servlet绝对是多线程的。

servlet是多线程的——这是其效率的基础。可以使用"implements SingleThreadModel"来创建一个单线程servlet,这样对于每个请求都会创建一个新对象。

最近这个接口SingleThreadModel被弃用了

这取决于实现。servlet接口没有指定。http://docs.oracle.com/javaee/5/api/javax/servlet/Servlet.html

然而,如果你看到HttpServlet,那么你可以看到它指定它应该被同步。http://docs.oracle.com/javaee/5/api/javax/servlet/http/HttpServlet.html

也许,下面链接中的图表说明了一切……http://www.tutorialspoint.com/servlets/servlets-life-cycle.htm

最新更新