servlet的生命周期一般為:
1.建立初始化servlet
2.處理從客戶端的零個或多個請求
3.銷毀servlet,gc回收占用內存
每個server可能在如何支持servlet上有不同的方法,但是上述servlet生命周期卻是每個servlet 引擎必須遵守的規則。
實例持久化Instance Persistence:
一個servlet 實例一旦加載,就開始處理對這個servlet的所有請求,換句話說就是一個servlet只生成一個實例。這樣的做法對於性能的提高很有好處,能夠有效地降低系統開銷,而且也能有效實現持久化(例如數據庫連接,cache數據)
import java.io.*;import javax.servlet.*;import Javax.servlet.http.*;public class SimpleCounter extends HttpServlet {int count = 0;public void doGet(HttpServletRequest req, HttpServletResponse res)throws ServletException, IOException {res.setContentType("text/plain");PrintWriter out = res.getWriter();count++;out.println("Since loading, this servlet has been Accessed " +count + " times.");}}上例是一個簡單的反映servlet持久化的例子,每個請求均增加本地變量count,然後打印顯示。 但是上例存在多線程風險,對於訪問servlet的每個請求都可以看作是一個線程對象,他們均訪問同一個servlet實例,所以會出現並發問題。特別是存在對共享變量的讀寫操作時(例如上例的本地變量count),這種危險性更大。
解決的辦法是增加synchronized塊。
PrintWriter out = res.getWriter();synchronized(this) {count++;out.println("Since loading, this servlet has been Accessed " +count + " times.");}
事實上,server上對每一個servlet的注冊名稱都對應servlet的一個實例,用來訪問servlet的請求名稱決定哪個實例來處理請求,
servlet reloading