由于Servlet只会有一个实例,多个用户同时请求同一个Servlet时,Tomcat会派生出多条线程执行Servlet的代码,因此Servlet有线程不安全的隐患.如果设计不当,系统就会出现问题.
package com.helloxr.servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class ThreadSafetyServlet extends HttpServlet { private static final long serialVersionUID = 1212121211L; private String name; public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { name = request.getParameter("name"); // 从request中读取name参数 try{ Thread.sleep(5000); // 为突出效果,让线程沉睡5秒钟 }catch(InterruptedException e){ } response.setCharacterEncoding("UTF-8"); response.setContentType("text/html"); response.getWriter().println("您好, " + name + ". 您使用了 GET 方法提交数据"); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { name = request.getParameter("name"); response.getWriter().println("您好, " + name + ". 您使用了 POST 方法提交数据"); } }
为了突出效果,doGet()方法让线程沉睡5秒,5秒内分别用两个浏览器访问 ThreadSafetyServlet?name=lmn 与ThreadSafetyServlet?name=1233343434.显示的结果均为:
""您好, 1233343434. 您使用了 GET 方法提交数据",这就意味着程序出现了问题.
原文:http://www.cnblogs.com/datapool/p/6262617.html