Servlet中的线程安全问题

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

  

posted @ 2016-04-13 21:31  戒。  阅读(85)  评论(0)    收藏  举报