(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是多實例的。