首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 計數器教學(四):第一版——最簡單的 application 域計數器

     編輯:Java 相關知識

系列回顧篇:展示最原始、無同步、無持久化的計數器第一版,作為後續版本演進的基準,直觀展示併發Bug與重啟歸零問題。

第一版完整代碼

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html><head><meta charset="UTF-8"><title>計數器第一版</title></head><body>
Hello World!
<% 
    // 直接從 application 域取得計數器
    Integer count = (Integer) application.getAttribute("INDEX_COUNTER");
    // 首次訪問初始化
    if (count == null) {
        count = 0;
        application.setAttribute("INDEX_COUNTER", count);
    }
    count++;  // 訪問次數 +1
    application.setAttribute("INDEX_COUNTER", count); // 寫回
%>
當前總訪問次數:<%= count %>
</body></html>

運行現象

  1. 單用戶刷新:正常遞增 1, 2, 3...
    首次訪問 刷新一次
  2. 換瀏覽器/無痕模式訪問:計數繼續遞增(共享 application 域)
    換瀏覽器 再刷新
  3. Tomcat 重啟:計數歸零,資料丟失。

存在的兩大核心問題

驗證併發 Bug 方法

在 count = (Integer) application.getAttribute(...) 後插入 Thread.sleep(10000),雙瀏覽器同時刷新,觀察最終計數僅增加 1 而非 2。

演進路線圖

第一版 (application, 無鎖) 
  → 修正版 (application + synchronized) 
  → 檔案版 (File + synchronized) 
  → JDBC 版 (MySQL + 事務/行鎖) 
  → JavaBean 版 (分層架構) 
  → Hibernate 版 (ORM)

每一版解決一個核心痛點,層層遞進,適合初學者理解 Web 開發從「能跑」到「健壯」的演進邏輯。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
問題現象原因解決方向
併發安全多用戶同時訪問,計數遺漏(如 100 並發僅增 60)「讀-改-寫」非原子,線程覆蓋彼此結果synchronized / AtomicInteger / 資料庫行鎖
資料持久化Tomcat 重啟/重新部署,計數歸零application 域隨 ServletContext 銷毀檔案 / 資料庫 / Redis 持久化