我需要知道为什么Servlets不是线程安全的?而在Struts 2.0框架中,控制器Servlet为什么是线程安全的?
我需要知道为什么Servlets不是线程安全的?而在Struts 2.0框架中,控制器Servlet为什么是线程安全的?
Servlet是普通的Java类,因此它们不是线程安全的。
但是话说回来,如果没有实例变量,Java类就是线程安全的。只有实例变量需要同步。(实例变量是在类中声明的变量而不是在其方法中声明的变量)。
方法中声明的变量是线程安全的,每个线程创建自己的程序堆栈,并且函数变量被分配在堆栈中。这意味着方法中的变量为每个线程创建,因此不会出现任何与线程同步相关的问题。
方法变量是线程安全的,类变量不是。
每个servlet映射只有一个servlet实例;所有实例属性在所有请求之间共享。对这些属性的访问必须考虑到这一点。
Struts 2动作(不是“控制器servlet”,它们既不是servlet也不是控制器)按请求实例化。动作属性仅由一个请求的线程访问。
Servlet通常是多线程的。
Servlet容器通常通过为每个请求创建一个新的Java线程来管理并发请求。新线程被赋予所请求的servlet的对象引用,该servlet通过同一线程发出响应。因此,在编写servlet时设计并发性非常重要,因为同一servlet实例可能处理多个请求。
Servlet容器处理servlet请求的方式取决于实现方式;它们可以使用单个servlet,也可以使用servlet池,这取决于供应商的系统架构。
每个请求都会实例化Struts 2 Action对象,因此不存在线程安全问题。
Servlet不是线程安全的,但我们可以通过将该servlet类实现为SingleThreadModel
来使其成为线程安全的,如下所示的类定义,但性能问题仍然存在,因此更好的选择是使用同步部分。
public class SurveyServlet extends HttpServlet
implements SingleThreadModel
{
servlet code here..
...
}
Servlet本身不是线程安全的。可以通过将service方法同步来使其线程安全。 您需要实现SingleThreadInterface以使其线程安全。