2013-02-25 55 views
1

在的doPost)阻挡(I定义一个servlet(它映射到/指数)和重写doPost方法是这样的:索取的HttpServlet

private Object lock = new Object(); 
protected void doPost(HttpServletRequest req, HttpServletResponse resp) 
      throws ServletException, IOException { 
     System.out.println("start"); 
     synchronized(lock) { 
      try { 
       lock.wait(15000); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
      lock.notifyAll(); 
     } 
    } 
当第一请求进入

,它打印“开始”然后等待lock.wait(15000); 然后第二个请求来了,它应该被阻止在synchronized(lock);我认为。但事实是,第二个请求被阻止出doPost方法。在第一个请求变为lock.notifyAll();后,第二个请求进入doPost方法并打印'开始'。

我发现这只发生在两个请求查询完全相同的url时。这是Tomcat处理多线程的方式吗?我很困惑..

+0

请参考[小服务程序如何工作?实例化,会话变量和多线程](http://stackoverflow.com/q/3106452/1065197),以更好地理解Java Web应用程序服务器(而非仅Tomcat)如何与'Servlet'和'Thread'一起使用。顺便说一句,你**绝不能**在Web应用程序中使用这种代码(至少你想被解雇)。 – 2013-02-25 08:54:47

+0

'发射'?我认为他们会寻找谁雇用的? – Apurv 2013-02-25 09:03:15

回答

0

只有doPostdoGet方法的servlet是线程安全的,意味着每个线程它们被独立调用。该类本身仅实例化一次。
在上面的代码中,您正在获取对所有请求共享的类变量的锁定,因此您将获得每个请求的锁定。

为了让您的预期行为移动您的'对象instantiation inside doPost`方法。

+0

问题说'请求在doPost()中阻塞',所以我相信这是什么是必需/预期的行为 – Apurv 2013-02-25 09:02:16

+0

@Apurv嗯..可能你是正确的。 – 2013-02-25 09:13:26

相关问题