【问题标题】:Java Servlets threading modelJava Servlets 线程模型
【发布时间】:2011-01-06 21:57:20
【问题描述】:

我想知道是否有人可以向我解释 Java Servlet 的线程模型? 据我了解,servlet 容器中只能存在一个 servlet 实例,如果多个线程碰巧在等待该 servlet,则会以某种方式对请求进行序列化。 我不知道那个序列化过程是怎么发生的......

谁能解释一下?

【问题讨论】:

    标签: java servlets multithreading


    【解决方案1】:

    是的,有一个接口单线程模型。它是一个标记接口。 它使 servlet 的这个对象同步,即一次只有一个线程为对象服务。但它会产生诸如响应延迟之类的问题。对于解决方案,它们创建对象池,但池的大小也有限。所以最好使用 同步块

    【讨论】:

      【解决方案2】:

      从历史上看,您有两个模型,具体取决于您的 Servlet。如果 Servlet 实现了SingleThreadModel,那么请求在哪里排队。否则,这是现在唯一的模型,一个 Servlet 必须能够同时服务多个请求。因此,该模型中没有排队,除非容器具有某些速率限制功能。

      【讨论】:

        【解决方案3】:

        如果请求由 servlet 串行处理,那么 Web 应用程序将非常慢。实际上,servlet 需要是线程安全的,因为 servlet 的单个实例可以负责同时处理多个请求。

        通常,Web 应用程序容器会维护一个线程池来处理请求,传入的请求会按需分配给线程。

        【讨论】:

        • 提前感谢丹本的回复!但我还有一件事要澄清。线程安全意味着 servlet 中没有维护内部状态。因此,驻留在池中的任何 servlet 实例都具有与它们创建时相同的状态。我对么?谢谢!
        • 没有内部状态的类是线程安全的,但它不是线程安全的唯一方法。线程安全本身是一个很长的讨论,但例如,具有内部状态的类如果序列化对其内部状态的访问,则可以是线程安全的。
        • Servlet 也必须是线程安全的,因为它们与其他 Servlet(例如存储在 ServletContext 和 HttpSession 中的对象)共享状态信息
        • 那么,你的意思是一个线程让你的请求只能访问一个 servlet 实例吗?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-21
        相关资源
        最近更新 更多