springmvc 是基於servlet的研發-- 繼承frameworkServlet ;spring
那麼spring是基於方法的攔截。安全
spring的contorller,默認配置是單例,其中注入的service和dao也是單例。併發
那麼咱們一般認爲是contorller是線程不安全的。認爲spring線程安不安全,得先知道什麼是線程安全?mvc
網上有這樣一個答案:當多個線程訪問某個類時,無論運行時環境採用何種調度方式或者這些線程將如何交替執行,而且在主調代碼中不須要任何額外的同步或協同,這個類都能表現出正確的行爲,那麼這個類就是線程安全的。prototype
那麼咱們能夠發現有2個問題:線程
1.contorller中出現了公共的非final變量,不一樣線程交替賦值;對象
2.單例模式中併發時,對一個東西的併發實例化。繼承
使用spring時咱們應該儘可能避免在contorller裏使用變量。同步
contorller會在容器啓動的時候實例化contorller,注入的對象咱們也儘可能不要懶加載。那麼線程的安全問題獲得解決。servlet
一個http請求是一個獨立的線程,當訪問打容器時會建立request對象,隱藏獲取到的request也不一樣的。
固然若是有須要特殊狀況,能夠修改contorller的默認屬性@Scope("prototype")。這樣沒錯訪問都會從新建立contorller增長系統開銷。