日期:2014-05-17  浏览次数:20756 次

struts1.3.8线程安全问题


@Controller("/A/aaaddd")
public class HeHAction extends org.apache.struts.actions.DispatchAction{
@Resource(name="xxxServiceBean")
private xxxService xxxService;

         public ActionForward dBianList(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {

             各种代码.....
        }

}
 
   为了strut1 现成没有问题 可以采用的方法 
    1实现 SingleThreadModel 接口 
    2使用synchronized 关键字能保证一次只有一个线程可以访问被保护的区段
    3避免使用实例变量

但是DisPathAction 有实例变量
    protected static Log log = LogFactory.getLog(DispatchAction.class)
    protected Class clazz = this.getClass();
    protected HashMap methods = new HashMap();


也就是说  HeHAction  三种方式都没有采取  这样会不会 出问题
当然小oa系统 没几个人访问


@Resource

------解决方案--------------------
下面我们来解释为什么Struts1是线程不安全的。

1、Struts1

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

例如:

你在Action定义了一个 int i = 0;

然后在这个Action里面的某一个方法里面对这个i进行操作。

向下面代码这样:

[java] view plaincopy

    package web.servlet;  
      
    import java.io.IOException;  
    import java.io.PrintWriter;  
      
    import javax.servlet.ServletException;  
    import javax.servlet.http.HttpServlet;  
    import javax.servlet.http.HttpServletRequest;  
    import javax.servlet.http.HttpServletResponse;  
      
    /** 
     * @author Jack Zhang 
     * @version vb1.0 
     * @E