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内存模式如何给方法分配内存的内容, 我相信你们会找到答案。