Я создал простое приложение сервлетов со следующим кодом:
Используя java 1.8
Apache Tomcat 9.0.14
Servlet api 4.0
package com.cg.servlets;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MultiThreadedServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("request received");
try{
Thread.sleep(5000);
}catch(Exception ex) {
ex.printStackTrace();
}
response.setContentType("text/html");
PrintWriter pw = response.getWriter();
pw.println("<html><body>");
pw.println("<h1>MultiThreadedServlet</h1>");
pw.println("</body></html>");
pw.close();
System.out.println("request processed");
}
}
package com.cg.servlets;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class SingleThreadedServlet extends HttpServlet{
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
synchronized (this) {
System.out.println("request received");
try {
Thread.sleep(5000);
}catch(Exception ex) {
ex.printStackTrace();
}
response.setContentType("text/html");
PrintWriter pw = response.getWriter();
pw.println("<html><body>");
pw.println("<h1>SingleThreadedServlet</h1>");
pw.println("</body></html>");
pw.close();
System.out.println("request processed");
}
}
}
Я открыл 3 вкладки в браузереи попытался получить доступ к MultiThreadedServlet со всех 3 вкладок одновременно
Я ожидал увидеть следующее сообщение на консоли:
запрос получен
запрос получен
запрос получен
запрос обработан
запрос обработан
запрос обработан
Фактические результаты:
запрос получен
запрос обработан
запрос получен
запрос обработан
запрос получен
запрос обработан
Я открыл 3 вкладки в браузере и попытался получить доступ к SingleThreadedServlet со всех 3 вкладок одновременно
Я ожидал увидеть следующее сообщение на консоли:
запрос получен
запрос обработан
запрос получен
запрособработано
запрос получен
запрос обработан
Фактические результаты:
запрос рекeived
запрос обработан
запрос получен
запрос обработан
запрос получен
запрос обработан
SingleThreadedServlet работает должным образом.В случае MultiThreadedServlet, почему фактические результаты не совпадают с ожидаемыми результатами?