請直接看代碼,解釋都在裡面了
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%!// 一個同步用的鎖
private static final Object lock = new Object();%>
Hello Word!
<%
Integer count = 0;
// 此處是否有同步問題呢?
// 比如2個用戶同時拿到了當前的計數器,
// 訪問次數加1
// 當更新時是否會丟失訪問次數呢?
//
// 會的,你可以在count=的代碼後面增加如下的語句模擬一下就知道了
// 所以此處同樣要同步
// 那我們自己定義一個同步鎖吧,取名叫lock,放在了JSP的靜態代碼段裡,
synchronized (lock) {
// 我們使用application 記錄頁面訪問的計數器
// 先從裡面拿到數據
// 注意這裡一定要是使用Integer,而不是int
// 因為如果第一次訪問,則會返回null,再從Integer轉化為int時會出現nullPointerException
//
count = (Integer) application.getAttribute("INDEX_COUNTER");
//
// 讓線程等待10秒,這是你可以開2個浏覽器,分別刷新,
// 最後的計數器是只增加1的,而不是我們預期的2
// Thread.sleep(10000);
// 如果是第一次訪問,則進行初始化
if (count == null) {
// 這裡使用了JDK5.0以後支持的自動box方式
count = 0;
// 保存到application裡面
application.setAttribute("INDEX_COUNTER", count);
}
count++;
// 保存到application裡面
application.setAttribute("INDEX_COUNTER", count);
}
%>
當前一共訪問次數為:<%=count%>
</body>
</html>