为什么我们需要在Servlet的情况下实现单线程模型?

时间:2014-01-31 09:56:01

标签: java-ee servlets

为什么我们需要在Servlet的情况下实现单线程模型

3 个答案:

答案 0 :(得分:1)

如果您阅读Java Servlet Specification,您会找到问题的答案。那里有多个部分解释线程问题。例如:

  

第2.3.3.1节。多线程问题

     

servlet容器可以通过服务发送并发请求   servlet的方法。为了处理请求,Servlet Developer   必须为多个并发处理做出充分准备   服务方法中的线程。

     

虽然不推荐,但开发人员的替代方案是   实现需要容器的SingleThreadModel接口   保证一次只有一个请求线程   服务方式。 servlet容器可满足此要求   序列化servlet上的请求,或者维护一个servlet池   实例。如果servlet是已经存在的Web应用程序的一部分   标记为可分发的容器可以维护一个servlet池   应用程序分布在每个JVM中的实例。

     

对于没有实现SingleThreadModel接口的servlet,如果是   服务方法(或doGet或doPost等方法   调度到HttpServlet抽象类的服务方法)   已使用synchronized关键字servlet容器定义   不能使用实例池方法,但必须序列化请求   通过它。强烈建议开发人员不要同步   这些中的服务方法(或调度给它的方法)   情况,因为对业绩的不利影响。

也是本节。

  

第2.3.3.4节:线程安全

     

除了startAsync和complete方法之外,还实现了   请求和响应对象不保证是线程安全的。   这意味着它们应该只在范围内使用   请求处理线程或应用程序必须确保访问   请求和响应对象是线程安全的。

     

如果应用程序创建的线程使用容器管理的   对象,例如请求或响应对象,这些对象必须是   仅在对象的生命周期内访问,如部分中所定义   3.10和5.6。请注意,除了startAsync和complete方法之外,请求和响应对象不是线程安全的。如果   这些对象是在多个线程中访问的,访问应该是   同步或通过包装器完成添加线程安全,   例如,同步方法的调用来访问   请求属性,或使用本地输出流进行响应   线程中的对象。

在规范的其余部分中有更多这样的注释,似乎表明如果确保代码不需要任何同步,那么你可能会感觉更好。

答案 1 :(得分:0)

我认为它现在已被弃用,但是,最初一个servlet处理多个同时发出的请求,每个请求都在自己的线程中。通过注释servlet,您可以将请求汇集到串行处理中,因为servlet只允许一个线程处理其所有请求。

但正如我所说,它现在已被弃用,你不应该使用它。如果您有特殊的同步需求,则应手动处理..

答案 2 :(得分:0)

servlet程序员应该实现SingleThreadModel接口,以确保servlet一次只能处理一个请求。