因爲一個類型的Servlet只有一個實例對象,那麼就有可能會出現一個Servlet同時處理多個請求(eclispe中tomcat部署了servlet,谷歌可以訪問,IE可以訪問,Postman也可以訪問,且它們訪問的都是同一個實例),那麼Servlet是否爲線程安全的呢?答案是:“不是線程安全的”。這說明Servlet的工作效率很高,但也存在線程安全問題!所以我們不應該在Servlet中創建成員變量,因爲可能會存在一個線程對這個成員變量進行寫操作,另一個線程對這個成員變量進行讀操作。
舉例:
@WebServlet(name = "TreadServlet", urlPatterns = "/treadTest")
public class TreadServlet extends HttpServlet{
private String str = "我是初始化字符串";
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");//設置請求字符集
resp.setContentType("text/html;charset=utf-8");//設置響應字符集
resp.getWriter().write(str);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");//設置請求字符集
resp.setContentType("text/html;charset=utf-8");//設置響應字符集
str="我是post請求修改的方法";
}
}
不過servlet依賴的類,可以設爲成員變量,比如,另一個依賴的類service。因爲我們只是調用這個service類,不會去修改它,這樣就不會出現髒數據。每個人進servlet的doPost或doGet執行的操作不會受到其他線程的干擾。