您的位置:首页 > 编程语言 > Java开发

Struts1和Struts2的Action线程安全问题

2012-07-15 19:49 176 查看
前段时间把工作辞了,这几天忙着找工作,参加面试.在面试的过程中,有面试官会问到Struts1和Struts2的Action线程安全问题,只是知道说Struts1是线程安全的,至于原因就打不上来了,后来查了一下资料,在这里分享一下,也希望自己早日找到满意的工作.

李刚的著作《struts权威指南》中有这么一段:

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

1、Struts1

Struts1是单例模式,也就是说,Web容器(例如:Tomcat)启动的时候,就会实例化一个Action对象,那么所有请求都是用的这个对象。所以当遇到2个请求并发的时候,那么其实他们调用的是同一个类,这个时候当你在Action内部定义属性的时候,就会产生线程同步的问题。

例如:你在Action定义了一个 int i = 0;然后在这个Action里面的某一个方法里面对这个i进行操作。当并发的时候就会遇到问题。

所以:我们在用struts1的时候不能在action里面定义属性。要用到只的话只能在方法里面定义。

2、struts2

Struts 2 Action对象为每一个请求产生一个实例,因此没有线程安全问题 。所以我们可以在Struts2的Action里面去定义属性。

但是Struts2由于 Action和普通的Java类没有任何区别(也就是不用像Struts1里面那样去实现一个Struts的接口,有兴趣的朋友可以自己去了解),所以我们可以用Spring去管理Struts2的Action,这个时候我们就要注意了,因为当我们在spring里面去定义bean的时候,spring默认用的是单例模式。

所以在这个时候,你就要修改Spring的配置文件---即修改scope为prototype 。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: