我使用glassfish4,servlet的API 3測試你的情況,我觀察到以下幾點:
首先,我創建了一個用於GET和POST的servlet。這個servlet有5秒線程睡眠延遲
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private static Logger logger = Logger.getLogger(HelloServlet.class);
public HelloServlet() {
super();
logger.debug("HelloServlet created");
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
logger.debug("get start");
try { Thread.sleep(5000); }
catch (InterruptedException e) { e.printStackTrace(); }
logger.debug("get finish");
super.doGet(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
logger.debug("post start");
try { Thread.sleep(5000); }
catch (InterruptedException e) { e.printStackTrace(); }
logger.debug("post finish");
super.doPost(req, resp);
}
}
我又試圖調用都5秒窗口中GET和POST,這就是它看起來像
INFO: 2013-07-07 14:06:06 DEBUG HelloServlet:21 - HelloServlet created
INFO: 2013-07-07 14:06:06 DEBUG HelloServlet:27 - get start
INFO: 2013-07-07 14:06:08 DEBUG HelloServlet:41 - post start
INFO: 2013-07-07 14:06:11 DEBUG HelloServlet:34 - get finish
INFO: 2013-07-07 14:06:13 DEBUG HelloServlet:48 - post finish
- HelloServlet的只有1個實例這似乎是由 所有http工作線程共享
- get和post請求都由不同的線程提供服務,調用get和post方法不同步
所以你原來的理解似乎是正確
你是如何確認的要求並沒有被同時處理?無論如何,你曾經觀察到的任何「同步」效果大部分都是模擬的:除了在多核機器上 - 所有線程都是循環處理的(具有輕微變化的平臺到平臺) – kolossus
我會在get/post處理程序進入並離開處理程序之間添加一些人爲的睡眠,以確認實際情況。 –
@kolossus我不需要他們必須是同時的,但我的POST方法似乎阻止,直到它完成。我會嘗試在我的問題中添加更多的上下文以使問題更清楚。 –