首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > Web前端 >

struts1.x跟2.x的线程安全

2012-09-10 
struts1.x和2.x的线程安全线程安全是每个多线程的程序都要考虑的问题,struts也不例外,如果处理不当,会出现

struts1.x和2.x的线程安全

线程安全是每个多线程的程序都要考虑的问题,struts也不例外,如果处理不当,会出现问题,而且这种问题很难被排查出来,因此,需要在设计的时候就留意线程安全问题。

?

1.struts1.x

?

1.1Action是线程不安全的

?

struts1.x的Action在生命周期上与Servlet类似。Servlet由Tomcat容器并维护,而Action由Struts的ActionServlet产生并维护。每个Action都只有一个实例,在加载Struts时产生,在卸载Struts时销毁。

Struts用同一个Action的execute()方法处理所有特定URI的请求。例如用HelloAction来处理/hello.do,用PersonAction来处理/person.do。这些请求共同使用一个Action以及Action类属性等,因此Action与Servlet一样,都不是线程安全的。

由于Action 是线程不安全的,因此要避免写Action的属性。最好的办法是把Action属性置为final,禁止对其进行写操作,彻底避免线程不安全问题。

?

提示:Action中的属性最好标记为final,禁止对其进行写操作,避免线程不安全问题。

?

1.2 Form Bean是线程安全的

?

而Struts 1.x的Form Bean代表JSP表单,每次请求都会产生一个新的Form Bean,不会出现多个线程共有一个Form Bean的情况。因此Form Bean是线程安全的,Form Bean中可任意地定义可读写属性。

Struts 1.x里Action的单一实例特性节省了服务器的资源开支,算是一个优点,但是由此带来的线程不安全却为开发者带来了一些麻烦。到Struts 2.x中,Action中已经被设计wield线程安全的了,每个请求都会产生一个Action实例,请求处理完毕,Action实例即销毁。

?

2.Struts 2.x

?

线程安全

?

Struts1中所有的Action都只有一个实例,该Action实例会被反复使用。而Struts中每个Action都会有多个实例,处理一次请求生成一个实例,这些实例彼此独立,处理完毕即销毁。因此Struts 1的Action不是线程安全的,而Struts 2的Action是线程安全的,由于Action中没有其他特殊资源,使用完毕后被直接抛弃,而不会造成资源浪费。

热点排行