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,一个接口什么方法也没有,这样的借口叫标记接口