线程重入 reentrancy
指多个线程同时运行同一对象的同一方法
对于Servlet来说,要求doPost()/doGet()可重入
比如:Servlet : /Test
当多个客户端同时访问/Test时
-找到匹配的Servlet对象s
-创建多个线程
-每个线程里都调用s.doPost()方法
显然,此时要求doPost()方法必须可重入
最简单的原则:
在Servlet的所有的方法里,均不使用类的属性
单例转多例
单例转多例,是一种更简单的方法,可以保证doPost()是可重入的
如:
package my;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class Example3
*/
@WebServlet("/Example3")
public class Example3 extends HttpServlet {
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException
{
new ServiceHandle(request, response).handle();
}
}
package my;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ServiceHandle
{
HttpServletRequest request;
HttpServletResponse response;
public ServiceHandle(HttpServletRequest request, HttpServletResponse response)
{
this.request = request;
this.response = response;
}
public void handle() throws ServletException, IOException
{
}
}