不要在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,但是在第一个浏览器中打开是没有问题的,但是同时在两个浏览器中打开,第二个浏览器会访问不到数据