学习synchronized时,我们可以把synchronized放在方法体上,也可以放在方法体内
拿servlet来说,如果放在方法体上,就会把后面的request阻塞掉:
protected synchronized void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
System.out.println("Hello");
synchronized (this) {
try {
Thread.sleep(Integer.MAX_VALUE);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
PrintWriter writer = response.getWriter();
writer.write("get call");
writer.flush();
}
发多个请求都只能看到一个Hello
如果把synchronized放在方法体内则不会出现以上情况
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
System.out.println("Hello");
synchronized (this) {
try {
Thread.sleep(Integer.MAX_VALUE);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
PrintWriter writer = response.getWriter();
writer.write("get call");
writer.flush();
}