action到底是thread safe还是unsafe呢 我们来看看servlet是否是thread safe ,action都是继承至servlet的
看看其他资料的解释:
JSP默认是以多线程方式执行的,这是JSP与ASP,PHP,PERL等脚本语言不一样的地方,也是它的优势之一,但如果不注意多线程中的同步问题,会使所写的JSP程序有难以发现的错误。
JSP的中存在的多线程问题:
当客户端第一次请求某一个JSP文件时,服务端把该JSP编译成一个CLASS文件,并创建一个该类的实例,然后创建一个线程处理CLIENT端的请求。如果有多个客户端同时请求该JSP文件,则服务端会创建多个线程。每个客户端请求对应一个线程。以多线程方式执行可大大降低对系统的资源需求,提高系统的并发量及响应时间.对JSP中可能用的的变量说明如下:
实例变量
实例变量是在堆中分配的,并被属于该实例的所有线程共享,所以不是线程安全的.
JSP系统提供的8个类变量
JSP中用到的OUT,REQUEST,RESPONSE,SESSION,CONFIG,PAGE,PAGECONXT是线程安全的,APPLICATION在整个系统内被使用,所以不是线程安全的.
局部变量
局部变量在堆栈中分配,因为每个线程都有它自己的堆栈空间,所以是线程安全的.
静态类
静态类不用被实例化,就可直接使用,也不是线程安全的.
外部资源:
在程序中可能会有多个线程或进程同时操作同一个资源(如:多个线程或进程同时对一个文件进行写操作).此时也要注意同步问题.
使它以单线程方式执行,这时,仍然只有一个实例,所有客户端的请求以串行方 式执行。这样会降低系统的性能
最后的解决方案是:不要在action里用实例变量
struts的action是非线程安全的。
不要在action中定义实例变量。
在spring的配置文件中,可以配置action为线程安全,即每次调用都生成一个新的实例,而不是只用一个实例。
bean中设置singleton="true"
<bean id="/itemDayAction" class="com.joyinter.skype.statistic.action.ItemDayAction" singleton="true">
<property name="itemDayBO">
<ref bean="itemDayBO"/>
property>
<property name="avatarItemBO">
<ref bean="avatarItemBO"/>
property>
bean>
分享到:
相关推荐
Servlet和Struts Action是两种常见的Java Web开发组件,它们在多线程环境下运行时可能存在线程安全问题。线程安全是指在多线程环境中,一个类或者方法能够正确处理多个线程的并发访问,保证数据的一致性和完整性。 ...
在Struts1中,每个`Action`类实例是被多个请求重用的,这使得它在多线程环境下存在潜在的线程安全问题。当多个线程同时访问一个`Action`实例时,可能会因为共享状态而导致数据不一致或其他并发问题。 - **Struts1中...
### servlet与Struts action线程安全问题分析 #### 一、引言 随着互联网应用的不断普及和发展,基于Servlet和JSP技术的应用程序在企业级应用中占据着重要的位置。Servlet作为一种常用的技术栈,因其多线程运行特性...
然而,使用Struts框架时,开发者需要注意一个关键的安全问题,那就是Action类的线程安全问题。这个问题主要源于Servlet容器(如Tomcat)对Servlet的处理方式。 首先,我们需要理解Servlet的生命周期。Servlet在Web...
因此,如果Action类中有实例变量,它们可能会被多个线程共享并同时访问,从而引发线程安全问题。 - **使用局部变量**:局部变量是线程安全的,因为它们是在方法调用时在栈上分配的,每个线程都有其独立的栈空间。这...
总结来说,Java Struts2通过为每个请求创建新的Action实例,解决了Servlet的线程安全问题。但开发者仍然需要关注Action所依赖的对象的线程安全,以确保整个应用程序的稳定性和数据一致性。在编写Struts2应用时,遵循...
相比之下,Struts2的Action为每个请求创建一个新的实例,消除了线程安全问题,简化了资源管理。 在Servlet依赖性上,Struts1的Action直接依赖于Servlet API,执行方法接收HttpServletRequest和HttpServletResponse...
相比之下,Struts2 为每个请求创建一个新的 Action 实例,避免了线程安全问题。 3. **对 Servlet API 的依赖**: - Struts1 的 Action 直接依赖于 Servlet API,请求和响应对象会传入 execute 方法。而 Struts2 ...
相比之下,Struts2为每个请求创建一个新的Action实例,避免了线程安全问题,简化了开发者的任务。 在Servlet依赖上,Struts1的Action直接依赖于Servlet API,执行方法接收HttpServletRequest和HttpServletResponse...
- **Struts2** 为每个请求创建新的Action实例,解决了线程安全问题,同时也更易于管理和测试。 5. **Servlet依赖** - **Struts1.x** 的Action类直接依赖于Servlet API,这使得测试变得更加困难。 - **Struts2** ...
相比之下,Struts2为每个请求创建新的Action实例,消除了线程安全问题,也简化了开发流程。 在Servlet依赖上,Struts1的Action直接依赖于Servlet API,这意味着Action的execute方法接收HttpServletRequest和...
这种多例模式避免了线程安全问题,并且使得Action的开发变得更加简单直接。 #### 三、Servlet依赖性 - **Struts1** 的Action类依赖于Servlet API,因为每一次Action调用都会将`HttpServletRequest`和`...
Struts2 Action 对象为每一个请求产生一个实例,因此没有线程安全问题。Struts1 Action 是单例模式并且必须是线程安全的,因为仅有 Action 的一个实例来处理所有的请求。 5. Struts2 的配置文件: Struts2 的配置...
例如,`(12).pdf`、`(10).pdf`等可能对应书中关于特定话题的讨论,比如MVC设计模式、Action类的实现、国际化与本地化、Struts标签库的使用等。`(3).pdf`、`(8).pdf`等可能涉及的是更深层次的主题,如自定义拦截器、...
这就导致了如果在Action中保存实例变量,则可能会出现线程安全问题。此外,Struts1中的Action类必须实现`Action`接口,并重写`execute`方法来处理请求。 - **Struts2**: 相比之下,Struts2中的Action是多例的,每次...
- **Struts2**:Action对象为每个请求创建一个新的实例,消除了线程安全问题,提高了性能。 3. **Servlet依赖**: - **Struts1**:Action直接依赖于Servlet API,需要HttpServletRequest和HttpServletResponse...
- **Struts2**:每个请求都会创建一个新的Action实例,消除了线程安全问题。这种模式使得Action设计更加简单直接,减少了因线程安全考虑带来的额外工作。 #### 三、Servlet依赖的对比 - **Struts1**:Action类直接...