`
andey007518
  • 浏览: 22158 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

谈下sturts1和struts2的action 线程安全问题

 
阅读更多
问及struts方面的内容:aciton是否thread safe?



下面是找的另一位同胞的文章:

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里用实例变量

又另一位同胞的文章,关于Struts2的线程安全:

在最近使用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类中只使用局部变量,不使用实例变量。
分享到:
评论

相关推荐

    Struts1、Sturts2 PDF教程

    然而,随着软件开发需求的复杂化,Struts1逐渐暴露出一些局限性,如性能问题、缺乏类型安全、依赖过多的XML配置等。因此,Struts2应运而生,它是一个更现代化的框架,融合了其他优秀框架如WebWork的核心特性。 ...

    Struts 1 &sturts

    - **模块化支持:**Struts 2支持每个Action运行在一个独立的线程中,这有利于资源管理和隔离潜在的并发问题。 - **配置灵活性:**Struts 2提供了丰富的配置选项,允许开发者根据项目需求进行细致调整,包括拦截器、...

    struts2图片上传并预览

    Struts2是一个强大的Java web应用程序框架,用于构建和部署可维护、高性能的MVC(Model-View-Controller)架构的应用程序。在Web开发中,图片上传和预览是常见的功能需求,尤其对于用户交互丰富的应用来说。Struts2...

    struts2 最新漏洞 S2-016、S2-017修补方案 .docx

    最近,Struts2 发生了两个严重的漏洞,分别是 S2-016 和 S2-017,这两个漏洞可能会导致攻击者执行恶意代码,从而危害到网站的安全。 S2-016 漏洞是由于 Struts2 的 Ognl 表达式语言解析器存在缺陷,从而导致攻击者...

    struts2学习笔记(完美总结)——转自OPEN经验库

    OGNL是Struts2中用于对象属性访问和表达式语言,它允许在Action、ValueStack和视图层之间传递数据。ValueStack是一个对象栈,它持有ActionContext上下文中的所有对象,包括Action实例、ActionForm、Session、Request...

    sturts2入门例子

    1. **Struts2框架基础**:Struts2是Apache软件基金会的一个开源项目,它在Struts1的基础上进行了大量的改进,提供了更灵活的控制流,更强的异常处理,以及更丰富的插件架构。 2. **环境搭建**:首先,你需要下载...

    struts2所有jar包程序文件

    1. `struts2-core.jar`:这是Struts2框架的核心库,包含了Action、Result、Interceptor等核心组件的实现。 2. `xwork-core.jar`:XWork是Struts2的基础,提供了许多底层的功能,如类型转换、对象图导航、事件处理等...

    sturts2安装及工作流程

    2. **线程模型**:在Struts1中,Action是单例模式,需要处理所有请求,所以必须确保线程安全。而在Struts2中,Action对象为每个请求创建一个新的实例,消除了线程安全的顾虑。这一改变使得Action的实现更加简单,...

    一个struts2的例子:彻底解决STRUTS2 错误There is no Action mapped for namespace / and action name login

    前几天在网上下载一个struts2的helloword的例子,那个作者也真够缺德的,搞个错误...看网上都催struts2比struts1 整的整的好,我看就这个问题,完全可以算struts2是个垃圾 我现在把完整的程序提供给大家,希望大家看看

    Struts2_Action-1

    Struts2基础知识讲解PPT课件---Struts2_Action,详细介绍action的工作原理

    Struts in Action

    《Struts in Action》这本书是Java Web开发领域中关于Apache Struts框架的一本经典著作,由Manning出版社出版。Struts是一个开源的MVC(Model-View-Controller)框架,它帮助开发者构建基于JSP和Servlet的应用程序,...

    struts2例子中的action类

    很经典的struts2开发实例,其中的action类的写法可以教你很清楚的了解具体的调用过程回给你开发带来很大的帮助

    基于struts2的简单购书管理系统

    1. **Struts2框架**:Struts2是Apache软件基金会的一个开源项目,它是基于MVC设计模式的。它的核心功能包括请求分发、拦截器、结果映射、国际化、插件扩展等。在这个购书管理系统中,Struts2负责处理HTTP请求,调用...

    struts2小项目

    Struts2的核心包括Action、Result、Interceptor等组件,它们共同协作完成请求处理和视图展示。 2. **连接数据库**: 在Struts2项目中,通常使用JDBC或者ORM(对象关系映射)框架如Hibernate或MyBatis来与数据库...

    STRUTS2:零配置插件CodeBehind

    随着框架的发展,Struts2社区不断推出新的插件和技术来进一步简化开发流程。本文将详细介绍Struts2中的两个插件——Zero Config(零配置)与CodeBehind,以及它们如何共同工作以减少配置文件的复杂度。 #### 二、...

    基于struts2+hibernate4的学生管理系统

    1. **Action类**:这是Struts2的核心组件,负责处理用户的请求。比如,我们可以有一个`StuInfoAction`,其中包含`addStudent()`和`deleteStudent()`方法,分别对应添加和删除学生功能。 2. **实体类**:如`Student`...

    struts2-apps.rar

    - Struts2支持使用注解来简化配置,例如在Action类或方法上直接标注@Action和@Result。 5. **插件机制**: - Struts2有丰富的插件库,如Tiles、Freemarker、i18n等,可以方便地集成到应用中。 6. **异常处理**:...

    Struts2+jQuery(不用JSON)实现局部刷新

    Struts2和jQuery是两种非常流行的开源技术,它们在Web开发中有着广泛的应用。Struts2作为MVC框架,主要用于处理后端业务逻辑,而jQuery则是一个强大的JavaScript库,简化了前端DOM操作、事件处理以及AJAX交互。在这...

    Sturts2.rar

    1. **配置Struts2插件**:首先,需要在Struts2的配置文件(struts.xml)中添加Commons FileUpload插件,以启用文件上传支持。 ```xml <constant name="struts.multipart.parser" value="jakarta"/> ``` 2. **...

    Struts2整合Spring、JPA

    至于`lib1`这个文件,可能包含了整合所需的一些依赖库,比如Struts2、Spring和JPA实现的JAR包,以及可能的数据库驱动和其他支持库。确保这些库被正确地添加到项目的类路径中是成功整合的基础。 总的来说,Struts2、...

Global site tag (gtag.js) - Google Analytics