`
wjboy49
  • 浏览: 274861 次
  • 性别: Icon_minigender_1
  • 来自: 湖南岳阳
社区版块
存档分类
最新评论

struts2 的线程安全

    博客分类:
  • java
阅读更多

在最近使用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

http://japi.iteye.com/blog/433506

分享到:
评论

相关推荐

    servlet与Struts action线程安全问题分析

    servlet与Struts action线程安全问题分析

    servlet与Struts action线程安全问题分析(pdf)

    servlet与Struts action线程安全问题分析 <br>===================================================== Servlet的线程安全问题只有在大量的并发访问时才会显现出来,并且很难发现,因此在编写Servlet程序时要...

    struts1,struts2,webwork,线程安全问题

    struts1,struts2,webwork,线程安全问题,easy518网 http://www.easy518.com/

    Struts线程安全

    struts线程安全,里面讲述了struts中的一些关于线程的安全方面的介绍。

    Struts1与Struts2本质区别

    2 线程模式方面的对比:Struts 1 Action是单例模式并且必须是线程安全的,因为仅有Action的一个实例来处理所有的请求。单例策略限制了Struts 1 Action能做的事,并且要在开发时特别小心。Action资源必须是线程安全的...

    java struts2学习笔记之线程安全

    主要为大家详细介绍了java struts2学习笔记之线程安全,感兴趣的朋友可以参考一下

    Struts中action线程安全问题解析

    主要介绍了Struts中action线程安全问题解析,涉及实例代码,还是挺不错的,具有一定参考价值,需要的朋友可以了解下。

    Struts 2 全版本漏洞检测工具 18.09 过waf版

    5、作者对不同的struts2漏洞测试语句做了大量修改,执行命令、上传功能已经能通用。 6、支持HTTPS。 7、支持GET、POST、UPLOAD三种请求方法,您可以自由选择。(UPLOAD为Multi-Part方式提交) 8、部分漏洞测试支持...

    Spring并发访问的线程安全性问题.docx

    springmvc的controller是singleton的(非线程安全的),这也许就是他和struts2的区别吧和Struts一样,Spring的Controller默认是Singleton的,这意味着每个request过来,系统都会用原有的instance去处理,这样导致了...

    Struts 2.0

    清晰的介绍了Struts 2.0框架的工作流程,Action线程安全,程序入口,配置文件。

    struts1的服务器端验证

    struts1的服务器端验证,一个很好的验证配置文件,线程安全问题有保障

    WEB中,各种技术的原理

    SSH、AJAX、线程安全、SERVLET等技术的原理和简单应用,共14个文档 1、ajax的原理.doc 2、Hibernate框架如何实现ORM.doc 3、java接口.doc 4、MVC 的原理 .doc 5、Servlet 工作原理解析.doc 6、servlet材料.doc 7、...

    spring+struts+Hibernate面试题

    几十道面试题 如:strust的。 Action是不是线程安全的?如果不是 有什么方式可以保证Action的线程安全?如果是,说明原因 。。。。。

    JAVA-SSH面试题

    struts1.2 Action是单例模式的并且必须是线程安全的,因为仅有一个Action的实例来处理所有的请求。 单例策略限制了Struts1.2 Action能做的事情,并且开发时特别小心。Action资源必须是线程安全的或同步的。 struts...

    java ssh 面试题

    java 框架面试题 Action是不是线程安全的?如果不是 有什么方式可以保证Action的线程安全?如果是,说明原因 struts1不是,struts2是;

    达内java培训目录

    Struts2 Struts2核心控制流程、Ognl、Action、Interceptor、Result、FreeMarker、Struts2标记库、Struts2扩展、Struts2应用技巧(输入验证、消息国际化、文件上传和下载、防止重复提交等)。 熟练掌握Struts2核心...

    SSH架构优缺点分析.rar

    标准struts的action是非线程安全(很多简历上写着"精通Struts"的高手们都忽视的问题) 不熟悉: struts标签库没怎么用过(常用jstl) 国际化只学过,没用过.停留在demo级别 validation.xml(配置文件写多了,有时候也...

    java面试题汇总

    2017最新java面试题汇总,包括ssm,ssh,ajax理解,冒泡排序,线程安全,spring mvc运行原理,spring mvc,struts1和struts2区别,Oracle的基本数据类型......

Global site tag (gtag.js) - Google Analytics