struts2的线程安全

收集作者From:http://japi.iteye.com/blog/432617

在struts1中并不会加这个。。而且对于struts1中的action都是单例的。虽然听说Singleton是个反模式,听说有性能问题。但在使用struts1的时候没有去深究,因为大家都这么用,用得很自然。

在查询资料的时候又看到了很多没有加上scope的问题

http://blog.csdn.net/foamflower/archive/2009/07/08/4329989.aspx

这些都是因为没有加上scope,导致上一次的变量值影响了下一次的请求。

还有如下问题:也让我想不通。

引用

《strut2权威指南》中有这么一段:

线程模式方面的对比:Struts1Action是单例模式并且必须是线程安全的,因为仅有Action的一个实例来处理所有的请求。单例策略限制了Struts1Action能做的事,并且要在开发时特别小心。Action资源必须是线程安全的或同步的;Struts2Action对象为每一个请求产生一个实例,因此没有线程安全问题。

由于对设计模式不太了解,做了这么之年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)最重要的是:局部变量是线程安全的。因为每执行一个方法,都会在独立的空间创建局部变量,它不是共享的资源。局部变量包括方法的参数变量。

strutsuserguide里有:

OnlyUseLocalVariables-Themostimportantprinciplethataidsinthread-safecodingistouseonlylocalvariables,notinstancevariables,inyourActionclass.

译:只使用用局部变量。--编写线程安全的代码最重要的原则就是,在Action类中只使用局部变量,不使用实例变量。

相关推荐