线程安全:在多线程环境下能正确执行的代码就是线程安全的,安全的意思就是能够正确执行,程序代码执行不出错误等其他异常情况
实例变量:在堆中分配的,并被属于该实例的所有线程共享,所以不是线程安全的
局部变量:在堆栈中分配,因为每个实例都有它自己的堆栈空间,所以是线程安全的
J2EE是一个多线程的环境,服务器针对每个请求启动一个线程来处理,所以有可能会有多个线程同时访问一个Servlet实例的情况。在Struts里面也是一样的,有可能会有多个线程同时访问一个Action实例的情况,这时就会出现线程安全的问题,所以要保证Action类中的方法具有“可重入性”,即不可以在Action的方法里改变实例变量的值。
在设计Action类时应该注意:
1、不要使用实例或静态变量存储特定请求的状态信息,因为它们会在同一个操作中共享跨越请求的全局资源,引发线程安全问题
2、如果并行访问资源需要保护,访问就要进行同步(例如:synchronized关键字的使用)
3、使用常量是线程安全的,因为只存在读操作
4、对构造器的访问(new 操作)是线程安全的,因为每次都创建一个实例,不会访问共享资源
5、局部变量也是线程安全的。因为没执行一个方法,都会在独立的空间创建局部变量,它不是共享资源。局部变量包括方法的参数变量。
分享到:
相关推荐
然而,使用Struts框架时,开发者需要注意一个关键的安全问题,那就是Action类的线程安全问题。这个问题主要源于Servlet容器(如Tomcat)对Servlet的处理方式。 首先,我们需要理解Servlet的生命周期。Servlet在Web...
Servlet和Struts Action是两种常见的Java Web开发组件,它们在多线程环境下运行时可能存在线程安全问题。线程安全是指在多线程环境中,一个类或者方法能够正确处理多个线程的并发访问,保证数据的一致性和完整性。 ...
### servlet与Struts action线程安全问题分析 #### 一、引言 随着互联网应用的不断普及和发展,基于Servlet和JSP技术的应用程序在企业级应用中占据着重要的位置。Servlet作为一种常用的技术栈,因其多线程运行特性...
在Struts1中,每个`Action`类实例是被多个请求重用的,这使得它在多线程环境下存在潜在的线程安全问题。当多个线程同时访问一个`Action`实例时,可能会因为共享状态而导致数据不一致或其他并发问题。 - **Struts1中...
因此,如果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 对象为每一个请求产生一个实例,因此没有线程安全问题。Struts1 Action 是单例模式并且必须是线程安全的,因为仅有 Action 的一个实例来处理所有的请求。 5. Struts2 的配置文件: Struts2 的配置...
相比之下,Struts2为每个请求创建新的Action实例,消除了线程安全问题,也简化了开发流程。 在Servlet依赖上,Struts1的Action直接依赖于Servlet API,这意味着Action的execute方法接收HttpServletRequest和...
- **Struts2** 为每个请求创建新的Action实例,解决了线程安全问题,同时也更易于管理和测试。 5. **Servlet依赖** - **Struts1.x** 的Action类直接依赖于Servlet API,这使得测试变得更加困难。 - **Struts2** ...
这种多例模式避免了线程安全问题,并且使得Action的开发变得更加简单直接。 #### 三、Servlet依赖性 - **Struts1** 的Action类依赖于Servlet API,因为每一次Action调用都会将`HttpServletRequest`和`...
在`web.xml`中配置`ActionServlet`,你可以设置其初始化参数,例如最大线程数、会话超时时间等,这些参数对性能优化至关重要。文件`web_xml中ActionServlet中的属性.doc`很可能详细解释了如何配置这些属性,帮助...
* 线程模式:Struts1.2 Action 是单例模式的,并且必须是线程安全的,而 Struts2.0 Action 为每一个请求产生一个实例,因此每有线程安全问题。 * Servlet 依赖:Struts1.2 Action 依赖于 Servlet API,而 Struts2.0 ...
这就导致了如果在Action中保存实例变量,则可能会出现线程安全问题。此外,Struts1中的Action类必须实现`Action`接口,并重写`execute`方法来处理请求。 - **Struts2**: 相比之下,Struts2中的Action是多例的,每次...
- **Struts1**中的Action对象在整个请求周期内是单例模式的,这意味着所有请求都会共用同一个Action实例,这可能会导致线程安全问题。 - 相比之下,**Struts2**为每个请求创建一个新的Action实例,这不仅提高了安全...