在最近使用struts2的时候,都会看到别人写的action中会加上一个scope("prototype")
这很是奇怪。为什么要加这个。。
在struts1中并不会加这个。。而且对于struts1中的action都是单例的。虽然听说Singleton是个反模式,听说有性能问题。但在使用struts1的时候没有去深究,因为大家都这么用,用得很自然。
在查询资料的时候又看到了很多没有加上scope的问题
http://blog.csdn.net/foamflower/archive/2009/07/08/4329989.aspx
http://elf8848.iteye.com/blog/356746
这些都是因为没有加上scope,导致上一次的变量值影响了下一次的请求。
还有如下问题:也让我想不通。
引用
《strut2权威指南》中有这么一段:
线程模式方面的对比:Struts1 Action是单例模式并且必须是线程安全的,因为仅有Action的一个实例来处理所有的请求。单例策略限制了Struts1 Action能做的事,并且要在开发时特别小心。Action资源必须是线程安全的或同步的;Struts 2 Action对象为每一个请求产生一个实例,因此没有线程安全问题 。
由于对设计模式不太了解,做了这么之年Struts,一直不知道struts1是单例模式,不知这一点是从哪体现出来的?
而在开发过程中要怎样注意“线程安全或同步”?struts2从哪体现的“没有线程安全问题”?
那么线程的问题到底体现在哪儿呢?
在查了些资料后。。明白了些!
http://hi.baidu.com/platon/blog/item/64a20ff3f96e7fce0b46e031.html
这文章中讲了最基本的servlet的多线程问题。
其实servlet本身就是个多线程环境下的单例类。web容器就是这样来处理servlet的。
通过这文章知道,为什么struts1中并没有考虑到线程问题,因为所有的代码都是写在execute的方法中,所有变量都是定义在里面,所以没有线程安全问题。
而现在的struts2就不一样了。struts2的action中就像一个POJO一样,定义了很多的类变量。这就有线程安全问题了。。此时,就使用scope=prototype来指定是个原型模式,而不是单例,这样就解决了线程安全问题。每个线程都是一个新的实例。。
http://hi.baidu.com/niujunkai/blog/item/021964adc130660a4a36d6ab.html
这文章也说明了问题的关键之处。
引用
但是,线程同步是不得以的方法,是比较复杂的,而且会带来性能的损失。等效的代码中,不需要同步在编写容易度和性能上会更好些。
我这里强调的是什么代码是始终为线程安全的、是不需要同步的。如下:
1)常量始终是线程安全的,因为只存在读操作。
2)对构造器的访问(new 操作)是线程安全的,因为每次都新建一个实例,不会访问共享的资源。
3)最重要的是:局部变量是线程安全的。因为每执行一个方法,都会在独立的空间创建局部变量,它不是共享的资源。局部变量包括方法的参数变量。
struts user guide里有:
Only Use Local Variables - The most important principle that aids in thread-safe coding is to use only local variables, not instance variables , in your Action class.
译:只使用用局部变量。--编写线程安全的代码最重要的原则就是,在Action类中只使用局部变量,不使用实例变量。
还有此文
http://www.iteye.com/topic/225749
分享到:
相关推荐
Struts2框架提供了多种策略来处理线程安全问题,包括Action实例的多例模式、使用拦截器进行同步控制等。开发者需要理解框架的工作原理,并结合最佳实践来避免线程安全问题。 总之,理解和处理Servlet和Struts ...
### Struts1、Struts2、WebWork框架中的线程安全问题分析 #### 一、Struts1与线程安全问题 在Struts1中,每个`Action`类实例是被多个请求重用的,这使得它在多线程环境下存在潜在的线程安全问题。当多个线程同时...
### servlet与Struts action线程安全问题分析 #### 一、引言 随着互联网应用的不断普及和发展,基于Servlet和JSP技术的应用程序在企业级应用中占据着重要的位置。Servlet作为一种常用的技术栈,因其多线程运行特性...
### Struts线程安全概述 在探讨Struts框架下的线程安全问题之前,我们需要了解一些基础知识。Struts是一个用于构建企业级Java Web应用程序的开源框架,它基于MVC(Model-View-Controller)设计模式。在典型的Web...
在讨论Struts2的线程安全问题之前,我们首先要理解什么是线程安全。线程安全是指在多线程环境下,一段代码在任何时候都能正确地处理并发访问,即不会因为线程间的交互而导致数据的不一致或破坏了代码的逻辑。 在...
- **Struts2**: Struts2中的Action更像是工厂模式下的产品,每个Action实例都是线程安全的。Struts2提供了ActionSupport基类来简化Action的实现。Action本身可以是任何实现了特定接口的Java对象,甚至是普通的POJO。...
Struts2是一个强大的Java web应用程序框架,用于构建MVC(模型-视图-控制器)架构的应用。这个API帮助文档是开发者在使用Struts2框架时的重要参考资料,它详细阐述了框架的各种组件、类库和方法,有助于理解并有效...
相比之下,Struts2 为每个请求创建一个新的 Action 实例,避免了线程安全问题。 3. **对 Servlet API 的依赖**: - Struts1 的 Action 直接依赖于 Servlet API,请求和响应对象会传入 execute 方法。而 Struts2 ...
### Struts2 与 Struts1 的核心区别 #### 一、架构设计及Action实现...综上所述,Struts2相比Struts1在架构设计、线程安全性、输入处理、表单验证等方面进行了大量的改进和优化,使得其更适合现代Web应用的开发需求。
综上所述,**Struts2**相较于**Struts1**在架构设计、实现方式以及各种功能细节上都有了显著的改进,特别是在线程安全性、可扩展性及灵活性方面表现得更加出色。这使得**Struts2**成为了许多企业级应用的首选框架之...
Struts2 Action 对象为每一个请求产生一个实例,因此没有线程安全问题。Struts1 Action 是单例模式并且必须是线程安全的,因为仅有 Action 的一个实例来处理所有的请求。 5. Struts2 的配置文件: Struts2 的配置...
- **Struts2**:Action对象为每个请求创建一个新的实例,消除了线程安全问题,提高了性能。 3. **Servlet依赖**: - **Struts1**:Action直接依赖于Servlet API,需要HttpServletRequest和HttpServletResponse...
然而,使用Struts框架时,开发者需要注意一个关键的安全问题,那就是Action类的线程安全问题。这个问题主要源于Servlet容器(如Tomcat)对Servlet的处理方式。 首先,我们需要理解Servlet的生命周期。Servlet在Web...
相比之下,Struts2为每个请求创建新的Action实例,消除了线程安全问题,也简化了开发流程。 在Servlet依赖上,Struts1的Action直接依赖于Servlet API,这意味着Action的execute方法接收HttpServletRequest和...
- **Struts2**: 相比之下,Struts2中的Action是多例的,每次请求都会创建一个新的Action实例,这样就避免了线程安全的问题。Struts2通过提供一个默认的基类`ActionSupport`,使得开发者可以很容易地继承这个类来创建...
- **Struts2**: 在Struts2中,为每个HTTP请求创建一个新的Action实例,从而避免了线程安全问题。这一改变极大地简化了代码编写,并降低了出错的可能性。尽管servlet容器会为每个请求创建多个临时对象,但并不会对...