1. 程式人生 > >Struts1,2,Servlet,Spring MVC單例多例 執行緒安全

Struts1,2,Servlet,Spring MVC單例多例 執行緒安全

Struts 1

單例,執行緒不安全,在請求的時候被第一次初始化
action中的service物件為何不會出現資料儲存的錯誤,大體意思就是每一個使用者發出一次請求後就有一個獨立的執行緒與之繫結,且有一個對應的servlet例項,你在其之上做的操作只屬於當前servlet例項,不會受其他servlet例項的影響,反之也不會影響其他執行緒的servlet例項。

Struts 2

預設多例,可以設定成單例,執行緒安全,但是一次不可能很多請求同時過來,那樣的話tomcat直接崩潰了。
struts 2的Action中包含資料,例如你在頁面填寫的資料就會包含在Action的成員變數裡面。如果Action是單例項的話,這些資料在多執行緒的環境下就會相互影響,例如造成別人填寫的資料被你看到了。所以Struts2的Action是多例模式的。

Spring MVC

預設單例,可以用@Scope(“prototype”)配置成多例,單例的話執行緒不安全,但是spring mvc不是用action的類屬性獲取引數,所以沒關係。
spring的單例確實存線上程安全的問題。但是spring是如何避免的呢,答案是他用了threadlocal這個類。

Servlet

單例項,多執行緒,執行緒安全,但是操作資料庫需要加鎖

servlet中的init方法只有在啟動(例如web容器啟動,要看loadOnStartup的設定)的時候呼叫,也就是隻初始化一次,這就是單例項。
servlet在處理請求的時候 呼叫的是service方法,這個方法可以處理多個客戶端的請求。
具體訪問時:
JSP 在web容器中”翻譯成servlet”由容器執行,web 容器本身就是提供的多執行緒,A,B,C 3個訪問,建立3個獨立的執行緒組,然後執行一個servlet。依次執行。

1、servlet首先不是現成執行緒的。
2、Servlet體系結構是建立在Java多執行緒機制之上的,它的生命週期是由Web容器負責的。
Servlet容器會自動使用執行緒池等技術來支援系統的執行
3、設定jsp:<%@ page isThreadSafe=”false”%>來實現單執行緒。

當你需要保證資料一致性的時候,必須自己處理執行緒安全問題時可以考慮單執行緒。