为什么struts2的action是线程安全的,struts1的action不是线程安全的? 
先对struts1和struts2的原理做一个简单的讲解

对于struts1 ,当第一次**.do的请求过来时,在内存中的actionmapping中找到相对应的action,然后new出这个action放在缓存中,当第二次一样的请求过来时,还是找的这个action,所以对于struts1来说,action是单实例的 ,只有一个,如果在action中定义变量,就要非常小心了,因为并发问题,可能带来灾难性的后果,也不是不可以,我们可以加锁达到同步,只是在性能上就要折衷了。

另外说几句 ,当struts交由spring管理的时候 ,spring的bean配置默认是单例的 , 
如果action是有状态的 ,必须显示的配置为prototype

  1. <bean id="saveUserAction" class="com.test.action.user.SaveUserAction" scope="prototype">
  2. <property name="service" ref="userService"></property>
  3. </bean>

下面是struts1.2的源码: 
当请求过来时,去找指定的action,如果有就直接取出来,如果没有就new一个新的action放到map中。

  1. /**
  2. * The set of Action instances that have been created and
  3. * initialized, keyed by the fully qualified Java class name of the
  4. * Action class.
  5. */
  6. protected HashMap actions = new HashMap();

processActionCreate这个方法里去一窥究竟吧: 
1、先获取类名 
2、根据类名去一个名为actions的map里查寻实例是否已经存在 
3、如果存在,则直接返回 
4、如果不存在,则创建一个新实例 
5、把创建好的action放到map里备用

  1. protected Action processActionCreate(HttpServletRequest request,
  2. HttpServletResponse response,
  3. ActionMapping mapping)
  4. throws IOException {
  5. // Acquire the Action instance we will be using (if there is one)
  6. String className = mapping.getType();//1、先获取类名
  7. ...
  8. Action instance = null;
  9. synchronized (actions) {
  10. // Return any existing Action instance of this class
  11. instance = (Action) actions.get(className);//2、根据类名去map里查寻实例是否已经存在
  12. if (instance != null) {
  13. return (instance); //3、如果存在,则直接返回
  14. }
  15. // Create and return a new Action instance
  16. //4、如果不存在,则创建一个新实例
  17. instance = (Action) RequestUtils.applicationInstance(className)
  18. instance.setServlet(this.servlet);
  19. actions.put(className, instance);//5、把创建好的action放到map里
  20. }
  21. ...
  22. return (instance);
  23. }

struts2 在struts1的基础上做了改进 ,对于struts2 ,每次请求过来都会new一个新的action , 所以说struts2的action是线程安全的 , 但同时也带来一个问题,每次都new一个action ,这样action的实例太多 , 在性能方面还是存在一定的缺陷的。

struts1是单例模式,而struts2是原型模式

最新文章

  1. jQuery—常用操作
  2. web app开发利器 - iscroll4 解决方案
  3. Spring MVC中Session的正确用法&lt;转&gt;
  4. UE4开发神秘海域类游戏原型 初阶(二):动画资源的整合
  5. python---set集合
  6. MFC 响应控件消息
  7. 整理CSS引发的相关理论的梳理
  8. .NET后台如何获取前台HMTL控件的值
  9. Windows 8 系统安装
  10. java常见异常集锦
  11. linux文件的通用操作方法学习
  12. Maven相关内容学习笔记一:基本配置和使用
  13. 40个Java集合面试问题和答案【中】【转载】
  14. HDU 1280 前m大的数
  15. Git 常用命令汇总
  16. 业余草通告CSDN博客用户zhang__ao非法转载文章的公告
  17. 【实验吧】Once More
  18. 结合JDK源码看设计模式——桥接模式
  19. keras用法
  20. 汕头市队赛 SRM 07 D 天才麻将少女kpm

热门文章

  1. mysql06---权限控制
  2. mysql04--存储过程
  3. Mac Launchpad图标调整
  4. [转]python_常用断言assert
  5. hdu3652(含有13且能被13整除的数)数位DP基础
  6. lua 与 c 的相互调用
  7. String类的直接赋值和构造方法赋值的区别
  8. 【黑金教程笔记之006】【建模篇】【Lab 05 SOS信号之一】—笔记
  9. java.util.Optional
  10. E20170524-hm