这个图的执行代码是:package com.test;import java.io.IOException;
import java.io.PrintWriter;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;/**
* Servlet implementation class MyServlet
*/
@WebServlet("/MyServlet")
public class MyServlet extends HttpServlet {
private static final long serialVersionUID = 1L; 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(2000); // 为了突出并发问题,在这设置一个延时
} catch (InterruptedException e) {
}
output.println("用户名:" + username + "<BR>");
} /**
* @see HttpServlet#HttpServlet()
*/
public MyServlet() {
super();
// TODO Auto-generated constructor stub
} /**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
* response)
*/
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
this.doPost(request, response);
} /**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
* response)
*/
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
this.service(request, response);
}}我不是理解图中T5,T6两步的解释。我个人认为在a,b两个窗口中都应该打印 用户名:b
但实际情况是b窗口打印了 a和b。求解
T4的时候代码第19行的PrintWriter output对象被替换为b的Writer对象.
然后在T4运行过后b线程睡眠了2000毫秒, 所以在T5的时候是a线程在运行.
而因为T4的时候b线程修改了output对象的值, 所以此时a线程的output对象其实是T4中b线程替换后的writer.
所以T5和T6实际上都是往b客户端上打印.