【问题标题】:Servlet: Singleton, Singlethread or Multi Instance MultithreadServlet:单例、单线程或多实例多线程
【发布时间】:2013-06-02 11:30:33
【问题描述】:

这个问题之前已经被问过并讨论过,但我想进一步问。

  1. Servlets 是否为单例? 据我说,它们仅由容器初始化,但它们仍然不是单例的??为什么?

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

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

我的工作在 MVC 环境中是否相同? (比如 Struts 1/2,Springs)

【问题讨论】:

    标签: java jsp servlets


    【解决方案1】:

    仅存在一个实例的事实并不意味着它不是多线程的。更多线程可以同时调用同一实例的同一方法。 Servlet 绝对是多线程的。

    【讨论】:

      【解决方案2】:

      Servlet 是多线程的——这是它们效率的基础。 可以使用“implements SingleThreadModel”使 servlet 成为单线程的,因此对于每个请求都会创建一个新对象。

      最近这个接口 SingleThreadModel 被弃用了

      【讨论】:

        【解决方案3】:

        这取决于实现。 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

        【讨论】:

        • “应该同步”——换句话说,代码将由多个线程执行。
        【解决方案4】:

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

        【讨论】: