为什么我们需要在Servlet的情况下实现单线程模型?
答案 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一次只能处理一个请求。