Servlet是線程安全的嗎?

資料:

(1)servlet的實例變量是線程不安全的,而其JSP也默認是以多線程方式執行(原創):html

https://blog.csdn.net/hunkdong/article/details/443430spring

(2)springmvc中的controller是單例的安全

https://www.cnblogs.com/flywang/p/5483732.html多線程

概括:

(1)Servlet不是線程安全的,由於它採用多線程方式運行其service方法.也就是說,當多個用戶併發訪問的時候,可能存在線程交互的問題。併發

 

(2)servlet的實例變量是線程不安全的,而JSP也默認是以多線程方式執行,因此其線程也是不安全的!mvc

以下:post

public class SplitPageXmlServlet extends HttpServlet {    
       String pageIndex=request.getParameter("pageIndex");
       String pageSize=0=request.getParameter("pageSize");
       String recordCount=request.getParameter("recordCount");
       public void doPost(HttpServletRequest request, 
                                  HttpServletResponse   response)         
               throws ServletException, IOException {}
}

上面的pageIndex, pageSize, recordCount都是實例變量,它們都是線程不安全的!url

 

(3)解決辦法:spa

要解決servlet線程不安全性,其中一個主要的方法就是取消Servlet的實例變量,變成無狀態的Servlet。.net

另一種方法是對共享數據進行同步操做。使用synchronized 關鍵字能保證一次只有一個線程能夠訪問被保護的區段。

 

(4)總而言之,凡是在線程內生成的數據對象,都是線程安全的。

 

(5)多線程的優勢:

以多線程方式執行可大大下降對系統的 資源需求,提升系統的併發量及響應時間。

 

(6)springmvc的controller與struts2的action的區別

1. springmvc的請求調度器是單Servlet多線程的,其controller默認是單例的,由於controller是以方法參數來接收請求參數的,也就是在線程內聲明並接收請求參數的

2. struts2的action是存在實例變量的,便是以action的實例變量來接收請求參數的,因此是線程不安全的,故只能在每一個線程內部都建立一個action對象,即action是多實例的

相關文章
相關標籤/搜索