首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > Java Web开发 >

struts1.3.8线程安全有关问题

2013-12-11 
struts1.3.8线程安全问题@Controller(/A/aaaddd)public class HeHAction extends org.apache.struts.act

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 
     * @Email virgoboy2004@163.com 
     * @Date 2013-4-21 
     */  
    public class ServletTest1 extends HttpServlet  
    {  
      
        public int i = 0;  
        /** 
         * Constructor of the object. 
         */  
        public ServletTest1()  
        {  
            super();  
        }  
      
        /** 
         * The doGet method of the servlet. <br> 
         * 
         * This method is called when a form has its tag value method equals to get. 
         *  
         * @param request the request send by the client to the server 
         * @param response the response send by the server to the client 
         * @throws ServletException if an error occurred 
         * @throws IOException if an error occurred 
         */  


        public void doGet(HttpServletRequest request, HttpServletResponse response)  
            throws ServletException,  
            IOException  
        {  
            i++;  
      
            response.setContentType("text/html");  
            PrintWriter out = response.getWriter();  
            out  
                .println("<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">");  
            out.println("<HTML>");  
            out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");  
            out.println("  <BODY>");  
            out.print("    i="+i);  
            out.println("  </BODY>");  
            out.println("</HTML>");  
            out.flush();  
            out.close();  
        }  
    }  


当访问这个servlet的时候,你访问多少次,I的值就是多少。

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

那至于为什么把属性的定义放到方法里面就不会有多线程的问题了,这个问题希望各位读者去查看有关JMM(java memory model)里面有关java内存模式如何给方法分配内存的内容, 我相信你们会找到答案。

热点排行