Java Web学习笔记-Servlet不是线程安全的

由于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 方法提交数据",这就意味着程序出现了问题.

原文地址:https://www.cnblogs.com/datapool/p/6262617.html