zoukankan      html  css  js  c++  java
  • 浅析Struts1和Struts2的Action线程安全问题

    1.Servlet非线程安全:

      我们先来简单回顾一下Servlet的生命周期“初始化->init->service->destroy->卸载”

      这里大家都知道,我们在web.xml里面定义一个servlet的时候,我们可以给他们设置一个“load-on-startup” 的值,如果 Servlet 的 load-on-startup 配置项大于 0,那么在 Context 容器启动的时候就会被实例化,并且tomcat给每一个servlet加载并且实例化一个对象  注解:也就是说,我们用户在web.xml里面配置的每一个servlet都会被实例成一个servlet对象

      也就是说,tomcat容器对servlet的实现采用的是单例模式,对于一个servlet类,永远只有一个servlet对象存在。

    2.Struts1非线程不安全:

      Struts1是对Java Web servlet接口的直接实现,所以它继承了tomcat对servlet的实现,每一个struts1里面的action都对应的是一个servlet class,所以这里的action在被tomcat实例化之后也是单例的,所以,struts1就产生了多线程问题

    所以:我们在用struts1的时候不能在action里面定义属性。要用到只的话只能在方法里面定义(单例线程安全问题)。

    3.struts2线程安全:

      上面我们了解了Struts1里面的多线程问题,那Struts2是怎么解决这个问题的呢?其实道理非常简单,原因就是Strtus2会获取到用户的http请求,然后负责给每个请求实例化一个Action 对象,但是大家注意,这里的action对象和Struts1里面的action对象完全不是一个概念,struts1里面的action类就是一个servlet类,而这里的action类只是一个普通的java class。这也就是为什么Struts1里面的action是线程不安全的,而struts2里面的action是线程安全的原因。

      那我们在回头来看看struts2对servlet的处理和struts1有什么不同。看过前面分析的读者肯定知道,struts1的 action对servlet没有进行任何的包装,它是直接实现的Java WEB API 里面的servlet 接口。所以才会有线程安全的问题,但是struts2底层帮我们封装了Servlet,使开发人员不用直接接触Servlet。具体做法是:

      Strtus2截获servlet请求,然后给每个请求实例化一个Action对象,请求结束之后销毁Action对象。至于Strtus2具体是怎么做的,我这里不赘叙,大家可以去参看Struts2的有关介绍。

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

  • 相关阅读:
    C++ Primer 随笔 Chapter 2 变量和基本类型
    比较全面的gdb调试命令 (转载)
    open和fopen的区别(转)
    来了
    Function语义学之member function
    TCP/IP学习(四)TCP缓冲区大小及限制(转)
    TCP连接的建立和终止
    Data 语义学(2)
    Data 语义学(1)
    一个类到底有多大?
  • 原文地址:https://www.cnblogs.com/gxz-sw/p/5434468.html
Copyright © 2011-2022 走看看