<%@ 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> |
新聞熱點
疑難解答