init(ServletConfig),僅執行一次。service(req, res),默認分發到 doGet/doPost 等方法。destroy() 釋放資源,隨後由 GC 回收。Servlet 默認單例模式:一個 Servlet 類對應一個實例服務所有請求。實例變量(如計數器 count)成為共享可變狀態,併發訪問導致競態條件。
public class SimpleCounter extends HttpServlet {
int count = 0; // 共享變量
public void doGet(HttpServletRequest req, HttpServletResponse res) {
count++; // 非原子操作:讀-改-寫
out.println("Accessed " + count + " times");
}
}
synchronized(this) { count++; ... } 粒度較大,影響並發度。AtomicInteger count = new AtomicInteger(); count.incrementAndGet(); 無鎖高效。開發期容器監測類文件變更自動重載 Servlet,生產環境需關閉以提升性能。重載會銷毀舊實例、創建新實例,init 再次執行,需妥善處理資源釋放與重新獲取。