加载后,servlet容器创建了多少个servlet实例? 它只有一个吗?
答案 0 :(得分:9)
Servlet 不遵守Singleton pattern。 Servlet类有一个公共构造函数,它已经违反了单例模式。默认情况下,servlet的创建只是Just Create One pattern。从技术上讲,容器可以根据需要创建尽可能多的容器。特别是如果servlet碰巧实现了(已弃用的)SingleThreadedModel
接口,那么容器可以创建这些servlet实例的池以提高性能。
但是,确实可以在多个请求之间共享同一个实例。这就是不将任何请求/会话作用域数据指定为servlet的实例变量非常重要的原因。它将在多个请求之间共享。
顺便说一下,Servlet本身遵循Template Method pattern。这与创作无关,只是一种行为模式。
答案 1 :(得分:4)
每个应用程序只创建一个单独的servlet实例(默认情况下是懒惰的),因此它必须是线程安全的(注意servlet字段)。但是,每个请求都会创建请求和响应对象,因此它们是线程安全的。
另一方面,HTTPSession
是每个用户会话一个(duh ...),因此如果同一个用户使用两个同时请求访问应用程序,请考虑同步会话。如您所见,servlet线程模型有点复杂......
答案 2 :(得分:2)
是的,有一个多线程的实例。