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中没有其他特殊资源,使用完毕后被直接抛弃,而不会造成资源浪费。