Servlet doPost方法 阻塞疑问

Grrrr 发布于 2013/02/25 16:06
阅读 1K+
收藏 1

很简单,看代码:

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();
		}
	}
servlet地址配置为 /index

第一个request进来的时候打印 start, 并停在

lock.wait(15000)
这行。

第二个request进来的时候我觉得应该阻塞在

synchronized(lock)
但是测试发现竟然连doPost方法都没进来,被阻塞在了外面,当第一个request
lock.notifyAll();
后,第二个request才进来,打印 start. 这不科学啊~~~!干了这么年web开发今天才发现这个问题。。。。

难道这就是tomcat处理方式??

加载中
0
cookqq
cookqq
确实不容易接受啊!感觉好像lock.wait(15000);在作怪吧
Grrrr
Grrrr
肯定不是! 因为这种情况仅当 2个request请求的地址完全一致时才会出现,比如第二个request 请求的地址一样,但是加了个参数,如:/index?name=a 就不会阻塞在方法外面,而是阻塞在synchronized(lock)这里。
0
cookqq
cookqq
你说的这种情况更不可思议了,为什么加上参数就可以了?
Grrrr
Grrrr
我也不知道啊·· 你有测试过吗?
0
cookqq
cookqq
这个没有测试过,但是这几天看的struts和servlet的知识好像不支持这个现象,能不能把你这个测试项目给我发一下啊?我研究一下。bugeasy@qq.com
Grrrr
Grrrr
就是一个servlet. 晚上我发一个war包到你邮箱。基于tomcat 6
0
huan
huan
很有可能是jvm的锁粗化造成的,变更url后锁粗化条件不成立所以退回优化。
0
OpenGrandSon
OpenGrandSon
发起请求的客户端软件(浏览器或自己实现的发起HTTP请求)的原因,它可能有不重复请求的机制,你如果用两个浏览器就不会有这个问题。
返回顶部
顶部