2016-12-16 119 views
4

對於Spring如果我有兩個同時訪問單例bean的請求?一個請求是否必須等到另一個才能完成。 Spring容器如何爲我的請求找到單例bean實例?Spring如何同時爲單個bean提供多個請求

對於servlets,如果我有兩個請求同時訪問普通類的普通方法(不靜態沒有其他複雜的東西)?一個請求是否必須等到另一個請求完成以避免併發(同時兩個請求試圖訪問同一個類的對象)。 Web容器如何爲我的請求找到實例?

+1

除非您執行某種「同步」以防止多個線程同時執行方法,否則不需要等待。 – Kayaman

回答

5

對於Spring,如果我有兩個請求同時訪問singleton bean ?一個請求是否必須等到 完成?

Spring容器爲singleton bean類創建一個且只有一個實例(如Controller,Service類等)。 在Java中,有幾種方法可以安全地爲類創建單例實例,您可以在此查看更多here。一旦Spring容器創建了單例實例,那麼將使用該控制器/服務類的單個實例來提供Web請求。

此外,即使兩個請求訪問單例bean,也不會有任何問題(即,兩者之間不會有任何等待),因爲它們將在兩個單獨的線程中提供服務,並且您需要確保的是您的控制器和服務類(即,單例範圍的bean)不攜帶/保持任何狀態(即它們是無狀態的)並且是線程安全的

Spring容器如何爲我的 請求找到單例bean實例?

Spring容器創建,然後注入你已經使用XML或通過註釋提供基於配置的單bean實例。

對於servlets,如果我有兩個請求訪問正常類的 正常方法(不靜態沒有其他複雜的東西)在同一時間? 是否有一個請求必須等到另一個請求完成以避免 併發(同時兩個請求試圖訪問相同類的 對象)?

否,每個請求將在一個單獨的線程來處理這樣一個請求將不等待其他請求要被服務/完成,亦即,換言之,該請求將被供應/並行處理。這是通過使用/管理線程池的Web容器來實現的。

Web容器如何爲我的請求找到實例?

Web容器(如Tomcat等))創建並加載所有servlet類(如Spring的DispatcherServlet或您自己的自定義servlet),然後一旦Web請求來自客戶端(如瀏覽器),它將根據網絡中配置的url-pattern處理到servlet。 XML或通過註釋。

+0

你應該說singleton bean應該是無狀態的,並且所有的方法都必須是線程安全的...... –

+0

現在,根據你的回答,如果請求由兩個單獨的線程處理,那麼servlet如何確保對象的狀態獲取不被其他線程修改? (如果你不明白我的觀點,你可以澄清).. – 008ak89