servlet的線程安全問題

因爲一個類型的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執行的操作不會受到其他線程的干擾。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章