Servlet中的线程安全问题

mac2025-11-13  5

Servlet中的线程安全问题:有共享时才会有线程安全问题 int i=0; public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { i++; try { Thread.sleep(1000*10);//休眠4秒 }catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } PrintWriter pw=response.getWriter(); pw.print(i); } }当有多个用户同时访问时,比如头一个用户应该得到的数据是1,但是其他的用户在这个用户还没拿到数据时访问就会使i++,这个造成了线程安全问题 *******解决方案一: synchronized (this) {//单线程处理,头一个用户完了,才轮到第二个,不足:当成千上万的用户访问的时候,后边的会”等死“; try { Thread.sleep(1000*10);//休眠4秒 } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } PrintWriter pw=response.getWriter(); pw.print(i); } *******方案二: 实现接口SingleThreadModel(创建新的Servlet实例),实际上并不是真正的解决了多线程安全问题,真正的解决线程安全问题是一个Servlet实例对象被多个 线程同时调用的问题 public class Demo2 extends HttpServlet implements SingleThreadModel{ int i=0; public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { synchronized (this) { i++; try { Thread.sleep(1000*4);//休眠4秒 } catch (InterruptedException e) { e.printStackTrace(); } PrintWriter pw=response.getWriter(); pw.print(i); } } 注意:1.子类覆盖父类的方法。不能比父类抛出更多的异常,所以这个不能throws ,只能try    2,一个接口什么方法也没有,这样的借口叫标记接口

  

最新回复(0)