线程不安全代码演示:
/**
* @classDesc: 功能描述:(线程不安全演示)
*/
@WebServlet("/ServletlDemo")
public class ServletlDemo extends HttpServlet {
private int i = 1;
@Override
public void init() throws ServletException {
System.out.println("ServletlDemo...init()");
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setCharacterEncoding("utf-8");// 内容编码,防止出现中文乱码
resp.setContentType("text/html;charset=utf-8");
// 向浏览器输出内容
resp.getWriter().write("这是第" + i + "次访问...");
i++;
}
@Override
public void destroy() {
System.out.println("ServletlDemo...destroy()");
}
}
当用两个浏览器同时访问时,会出现线程不安全问题,两个页面都显示是第一次访问
线程安全代码:(使用synchronized)
@WebServlet("/ServletDemo")
public class ServletDemo extends HttpServlet {
private int i = 1;
@Override
public void init() throws ServletException {
System.out.println("ServletDemo...init()");
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setCharacterEncoding("utf-8");// 内容编码,防止出现中文乱码
resp.setContentType("text/html;charset=utf-8");
synchronized (ServetlDemo.class) {
// 向浏览器输出内容
resp.getWriter().write("这是第" + i + "次访问...");
try {
Thread.sleep(5000);
} catch (Exception e) {
}
i++;
}
}
@Override
public void destroy() {
System.out.println("ServletDemo...destroy()");
}
}
评论区