程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 學Java-計數器-修正版

學Java-計數器-修正版

編輯:關於JAVA

請直接看代碼,解釋都在裡面了

<%@ 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>

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved