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
.
Lin*_*nus 18
Servlet是普通的java类,因此不是线程安全的.
但是,如果您没有实例变量,Java类是Thread安全的.只有实例变量需要同步.(实例变量是在类中声明的变量,而不是在其方法中.
方法中声明的变量是线程安全的,因为每个线程都创建自己的程序堆栈,并且函数变量在堆栈中分配.这意味着为每个线程创建方法中的变量,因此没有关联的任何线程同步问题.
方法变量是线程安全的,类变量不是.
每个servlet映射都有一个servlet实例; 所有实例属性都在所有请求之间共享.访问这些属性必须考虑到这一点.
Struts 2动作(不是"控制器servlet",它们既不是servlet也不是控制器)是按请求实例化的.只有单个请求的线程才能访问操作属性.
归档时间: |
|
查看次数: |
46206 次 |
最近记录: |