Servlet在使用中,使用成员变量存储数据所引发的线程不安全问题

不要在Servlet中通过成员变量的方式存储数据,如果一定要使用成员变量来存储数据,对数据进行操作需要使用线程同步的方式来解决线程安全问题,避免数据出现张冠李戴的现象

/**
 * @author: Mr.Wu
 * @description servlet线程安全问题
 * @date: 2021/12/15 14:37
 */
public class ThreadSafeServlet extends HttpServlet {
    PrintWriter pw;
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        synchronized (this){
            pw= resp.getWriter();
            String name = req.getParameter("name");
            try {
                Thread.sleep(5000);
                pw.println(name);
                pw.flush();
                pw.close();
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    }
}

程序执行顺序:tomcat会实例化一次servlet,但是在第一个浏览器中打开是没有问题的,但是同时在两个浏览器中打开,第二个浏览器会访问不到数据

上一篇:vue2在css中使用js变量


下一篇:Node.js express 中间件