为什么Servlet不是线程安全的?

amm*_*mmu 28 servlets

我需要知道为什么servlet不是线程安全的?什么是Struts 2.0框架控制器servlet是线程安全的原因?

Bal*_*usC 44

我需要知道为什么servlet不是线程安全的?

由于Java编程语言的多线程特性,Servlet实例本质上不是线程安全的.Java虚拟机支持多个线程执行相同的代码.对于具有多个处理器的计算机,这是一个很好的性能优势.这也允许多个并发用户执行相同的代码而不会相互阻塞.

想象一下具有4个处理器的服务器,其中普通的servlet每秒可处理1000个请求.如果这个servlet是线程安全的,那么Web应用程序将像,就好像它运行在服务器上用1个处理器,其中servlet可以处理每秒只有250请求(好吧,这不是正是这样,但你有这个想法).

如果在使用servlet时遇到线程安全问题,那么这是你的错,不是Java,也不是Servlet的错.您需要修复servlet代码,使得请求或会话范围数据永远不会被指定为servlet的实例变量.有关深入解释,另请参阅servlet如何工作?实例化,会话,共享变量和多线程.

什么是Struts 2.0框架控制器servlet是线程安全的原因?

它不是线程安全的.您将Struts调度程序servlet过滤器与Struts操作混淆.每次请求都会重新创建struts操作.因此,每个请求都有自己的请求作用域Struts操作的实例.Struts调度程序servlet过滤器不会将它们存储为自己的实例变量.相反,它将其存储为.的属性HttpServletRequest.

  • S2实际上使用的是过滤器,而不是servlet,与JEE指南相反:/ (3认同)

Lin*_*nus 18

Servlet是普通的java类,因此不是线程安全的.

但是,如果您没有实例变量,Java类是Thread安全的.只有实例变量需要同步.(实例变量是在类中声明的变量,而不是在其方法中.

方法中声明的变量是线程安全的,因为每个线程都创建自己的程序堆栈,并且函数变量在堆栈中分配.这意味着为每个线程创建方法中的变量,因此没有关联的任何线程同步问题.

方法变量是线程安全的,类变量不是.

  • 不太确定 _Only 实例变量需要同步_。静态变量也需要同步,它们不是实例变量。 (3认同)

Dav*_*ton 9

每个servlet映射都有一个servlet实例; 所有实例属性都在所有请求之间共享.访问这些属性必须考虑到这一点.

Struts 2动作(不是"控制器servlet",它们既不是servlet也不是控制器)是按请求实例化的.只有单个请求的线程才能访问操作属性.