当前位置:首页 > 开发 > 编程语言 > Struts2 > 正文

Struts1和Struts2 action的线程安全

发表于: 2012-04-21   作者:comeonbabye   来源:转载   浏览:
摘要: 转载自 _891229 最终编辑 glaivelee 去面试,问及struts方面的内容:aciton是否thread safe? 俺毫不犹豫的回答:不是 然后问,为什么不是?struts1和struts2那个是线程安全的?俺支吾了半天。也没说个所以然出来。郁闷。 下面是找的另一位同胞的文章: action到底是thread safe还是unsafe呢 我们来看看servlet
转载自 _891229
最终编辑 glaivelee

去面试,问及struts方面的内容:aciton是否thread safe?

俺毫不犹豫的回答:不是

然后问,为什么不是?struts1和struts2那个是线程安全的?俺支吾了半天。也没说个所以然出来。郁闷。

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

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.javaeye.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.javaeye.com/topic/225749

推荐文章:

Java编译过程与c/c++编译过程有何不同

hibernate+java+sql 之间数据类型转换关系

Myeclipse工程Hibernate配置文件备份

JAVA并发包 java.util.concurrent 线程池机制

named-capturing group of JDK7 Regex

集合类的一个Demo

JavaBean中的空字段(null 或 “ ”)数据如何在JSP页面美观显示

tomcat多域名配置

java异常 之 List 集合 数组越界

Java编程中线程池的最大性能开发与风险规避

session的工作原理

MyEclipse使用 之 应用设置指南

在MyEclipes 里保存自定义的jsp模板

Java 7:最新特性、代码示例及性能测试

使用 CAS 在 Tomcat 中实现单点登录

Java 7的新功能和Java 1.5,1.6,1.7的性能测试比较

EditPlus中配置java运行环境

TLD文件配置详解(jsp自定义标签)

Eclipse & Myeclipse 之 Copy Qualified Name 复制类全名解决办法

MyEclipse 8.5 开发环境配置,汉化,Aptana2.0插件,SVN 插件,Flex Builder 3/4 插件安装

TLD文件 模板

JSP生成的JAVA源码的绝对路径

学习java的30个目标

Java序列化的机制和原理

使用Java窃取sina大片

JAVA 并发线程异常处理

java关键字 volatile 详解

浅谈java内存模型

什么是JAVA工作内存

JAVA基础类知识点小结

java 正则扫描小实例

JAVA基础知识点

java编程语言特性

JAVA经典算法

JAVA经典算法 2

JAVA程序员的推荐书籍

Java 数组详解

用java数组实现基本链表和可自扩充的链表

Myeclipse7.X和8.X汉化

eclipse生成javadoc

static 关键字详解

java日期格式大小写汇总

JDK5 枚举详解

JAVA Enum 枚举特性

JAVA启动线程的方法

JAVA得到各个字节码对应的实例对象

java 排序小实例

方法中的内部类访问方法中的局部变量为什么要加final关键字?

Java 堆、栈和常量池 详解

static、final修饰符、内部类 与内存的关系

JDK5 交通灯模拟控制系统

Java SE 6 新特性: HTTP 篇

jdk1.6新特性

jdk1.5的新特性

 Java 理论与实践: 使用浮点数和小数中的技巧和陷阱

JDK5 代理类与工厂模式合作示例

JDK5 Proxy代理类的小实例

编写一个函数 要求将一个二维数组以回形针的顺序依次填入一个二维数组

java的线程同步机制synchronized关键字的理解

java线程的若干技巧

抽象方法为什么不能是static或native或synchronized

JAVA EE企业级开发四步走完全攻略 I

JAVA EE企业级开发四步走完全攻略 II

JAVA EE企业级开发四步走完全攻略 III

JAVA EE企业级开发四步走完全攻略 IV

关于JAVA项目config.properties配置的说明

JAVA5创建动态类及查看其方法列表信息示例

掌握以下知识 可以算是精通java了

国内外最好的java开发论坛及站点汇总

java 线程锁synchronized应用技巧

java基础知识点汇总 I

java基础知识点汇总 II

java基础知识点汇总 III

JAVA正则表达式高级用法(分组与捕获)

java正则表达式小应用更新 第三版

解决Myeclipse8.5启动时自动关闭的问题

Servlert 在 web.xml 中的配置说明

java正则表达式小应用更新 第二版

关于java线程锁的问题

Java 类中方法重载详解

java开源项目Log4J 详解

java正则表达式小应用

Java7: 正则表达式将支持命名捕获组

Jsp select top 无效的游标状态 解决办法

验证哥德巴赫猜想 : 1-100之內所有大于2的偶数都是两个素数之和

禁用myeclipse indexes 及 优化myEclipse 启动速度

在MyEclipse中导入: import javax.servlet.* 包时报错的解决办法

Java 相对路径与绝对路径的问题 2

Java 相对路径与绝对路径的问题

Tomcat5 中文乱码问题

java newInstance() 和 new Class() 的区别

JAVA基础面试题

java 注解实例

Java 提供的三个基本注解

Java核心API需要掌握的程度

关于java内省机制的一些描述与说明

关于 "MyEclipse 快速提取方法的技巧" 文章中get方法的另类实现(源码工程下载)

MyEclipse 快速提取方法的技巧

Apache Common BeanUtils 介绍及下载

JAVA反射机制详解 --- 反射基础及应用实例

JAVA反射机制详解 --- 通过Class类取得完整结构(了解)

JAVA反射机制详解 --- 反射的进一步应用(理解)

JAVA帮助文档全系列 JDK1.5 JDK1.6 JDK1.7 官方中英完整版下载

优化设置来提升MyEclipse8.5 软件性能

在MyEclipse 打开的html 标记属性值的智能提示

关于 myeclipse 中的'ISO-8859-1'编码问题

修改MyEclipse的智能感知功能

Myeclipse优化(智能提示、javadoc、解决jsp页面假死)

MyEclipse常用快捷键

CKEditor文件上传之JSP 实例

用记事本保存的UTF-8格式的java文件不能编译通过的解决方法

Tomcat5.5 安装文件夹结构及配置说明

TOMCAT 5.5 服务器 打开就关闭 的解决方法

JDK1.5 下载及安装环境配置

初学者笔记:刚接触Java是的学习方法及心情

JAVA学习----读此文章 有如醍醐灌顶 豁然开朗

J2ME里面的一些未实现的三角函数

相当不错的忠告!------如何编出健壮的代码 java编程30条规则

运行第一个JAVA程序

坦克大战代码_框架

Struts1和Struts2 action的线程安全

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号