![]() 圖1 Servlet線程池 |
Import javax.servlet. *; Import javax.servlet.http. *; Import java.io. *; Public class Concurrent Test extends HttpServlet {PrintWriter output; Public void service (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String username; Response.setContentType ("text/html; charset=gb2312"); Username = request.getParameter ("username"); Output = response.getWriter (); Try {Thread. sleep (5000); //為了突出并發(fā)問題,在這設置一個延時 } Catch (Interrupted Exception e){} output.println("用戶名:"+Username+" "); } } |
![]() 圖2 a用戶和b用戶的瀏覽器輸出 |
![]() 圖3 Servlet實例的JMM模型 |
調(diào)度時刻 | a線程 | b線程 |
T1 | 訪問Servlet頁面 | |
T2 | 訪問Servlet頁面 | |
T3 | output=a的輸出username=a休眠5000毫秒,讓出CPU | |
T4 | output=b的輸出(寫回主存)username=b休眠5000毫秒,讓出CPU | |
T5 | 在用戶b的瀏覽器上輸出a線程的username的值,a線程終止。 | |
T6 | 在用戶b的瀏覽器上輸出b線程的username的值,b線程終止。 |
Public class Concurrent Test extends HttpServlet implements SingleThreadModel { ………… } |
………… Public class Concurrent Test extends HttpServlet { ………… Username = request.getParameter ("username"); Synchronized (this){ Output = response.getWriter (); Try { Thread. Sleep (5000); } Catch (Interrupted Exception e){} output.println("用戶名:"+Username+" "); } } } |
…… Public class Concurrent Test extends HttpServlet {public void service (HttpServletRequest request, HttpServletResponse Response) throws ServletException, IOException { Print Writer output; String username; Response.setContentType ("text/html; charset=gb2312"); …… } } |