实例数量
通过注解描述的(第8章 注解和可插拔性)或者在 Web 应用程序的部署描述符(第14章 部署描述符)中描述的 servlet 声明,控制着 servlet 容器如何提供 servlet 实例。
对于未托管在分布式环境中(默认)的 servlet 而言,servlet 容器对于每一个 Servlet 声明必须且只能产生一个实例。不过,如果 Servlet实现了 SingleThreadModel 接口,servlet 容器可以选择实例化多个实例以便处理高负荷请求或者串行化请求到一个特定实例。
如果 servlet 以分布式方式进行部署,容器可以为每个 Java Virtual Machine (JVM™) 的每个 Servlet 声明产生一个实例。但是,如果在分布式环境中 servlet 实现了 SingleThreadModel 接口,此时容器可以为每个容器的 JVM 实例化多个 Servlet 实例。
关于 Single Thread Model
SingleThreadModel 接口的作用是保证一个特定 servlet 实例的service 方法在一个时刻仅能被一个线程执行,一定要注意,此保证仅适用于每一个 servlet 实例,因此容器可以选择池化这些对象。有些对象可以在同一时刻被多个 servlet 实例访问,如 HttpSession 实例,可以在一个特定的时间对多个 Servlet 可用,包括那些实现了SingleThreadModel 接口的 Servlet。
建议开发人员采取其他手段来解决这些问题,而不是实现这个接口,如避免使用实例变量或同步的代码块访问这些资源。SingleThreadModel 接口已经在本版本规范中弃用。