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,但是在第一个浏览器中打开是没有问题的,但是同时在两个浏览器中打开,第二个浏览器会访问不到数据
本文来自博客园,作者:(HelloWorld!),转载请注明原文链接:https://www.cnblogs.com/Simon-s/p/15692786.html --有志者,事竟成