1、servlet是线程不安全的,是单例
举例:
package com.config; import lombok.extern.slf4j.Slf4j; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @Slf4j @WebServlet("/*") public class MyServlet extends HttpServlet { private int count=0; @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { count++; resp.getWriter().write("this is count = "+ count); } }
结果:
this is count = 7
this is count = 8
2、怎样实现线程安全呢?
1.synchronized,将存在线程安全问题的代码放在同步代码开中
@Slf4j @WebServlet("/*") public class MyServlet extends HttpServlet { private int count=0; @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { synchronized (this) { count++; resp.getWriter().write("this is count = "+ count); } } }
2.实现SingleThreadModel接口,servlet实现SingleThreadModel接口后,每一个线程都会创建一个servlet实例,这样每一个客户就不会存在资源的共享问题,但由于响应太低,已被淘汰
@Slf4j @WebServlet("/*") public class MyServlet extends HttpServlet implements SingleThreadModel { private int count=0; @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { count++; resp.getWriter().write("this is count = "+ count); } }
3.尽可能使用局部变量
@Slf4j @WebServlet("/*") public class MyServlet extends HttpServlet implements SingleThreadModel { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { int count=0; count++; resp.getWriter().write("this is count = "+ count); } }