Java Servlets 线程模型

Posted

技术标签:

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

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

谁能解释一下?

【问题讨论】:

【参考方案1】:

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

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

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

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

【讨论】:

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

以上是关于Java Servlets 线程模型的主要内容,如果未能解决你的问题,请参考以下文章

(Java多线程系列七)Java内存模型和线程的三大特性

(转)Java线程Java内存模型总结

死磕 java线程系列之线程模型

Memcache-网络线程模型-源码分析

Java多线程之内存模型

java基础---多线程---java内存模型