2014-01-31 46 views

回答

0

我認爲它已經被廢棄,但是,原本一個servlet處理多個併發請求,每個在自己的線程。通過對servlet進行註釋,您可以將請求集中到串行處理中,因爲servlet只允許一個線程處理其所有請求。

但正如我所說,它現在已經過時了,你不應該使用它。如果你有特殊的同步需求,您應該手動處理它..

0

該servlet程序員應該實現SingleThreadModel接口確保servlet可以同時處理只有一個請求。

1

如果你讀了Java Servlet Specification,你會發現問題的答案。這裏有多個部分解釋線程問題。例如:

第2.3.3.1節。多線程問題

一個servlet容器可能通過servlet的服務 方法發送併發請求。爲了處理這些請求,Servlet Developer 必須爲在服務方法中與多個 線程同時處理做出適當的規定。

儘管不推薦,爲開發一種替代方法是 實現這需要容器 保證只有一個在 服務方法的時間請求線程SingleThreadModel接口。一個servlet容器可以通過 序列化一個servlet上的請求,或者通過維護一個servlet實例池來滿足這個要求。如果servlet是標記爲可分發的 的Web應用程序的一部分,那麼容器可以在應用程序分佈的每個JVM中維護一個servlet實例池。

對於未實現SingleThreadModel接口的servlet,如果 服務方法(或方法,諸如的doGet或doPost其是 分派到的HttpServlet抽象類的服務方法) 已經與同步關鍵字定義中,servlet容器 不能使用實例池方法,但必須通過它來序列化請求 。強烈建議開發人員不要在這些 的情況下同步 服務方法(或派發給它的方法),因爲這會對性能產生不利影響。

而且這一部分。

第2.3.3.4:線程安全

除了startAsync和完整的方法,在 請求和響應對象的實現不保證線程安全的。 這意味着它們只能在 的範圍內使用請求處理線程或應用程序必須確保訪問 的請求和響應對象是線程安全的。

如果由應用程序創建的線程所使用的容器管理 對象,諸如請求或響應對象,這些對象必須是 僅在對象的生命週期訪問如在章節3.10 和5.6所定義。請注意,除了startAsync和完整的方法以外,請求和響應對象不是線程安全的。如果 這些對象被多個線程訪問,該訪問應該 同步或通過包裝來完成添加的線程安全, 例如,同步的方法調用訪問 請求屬性,或者使用本地輸出流爲線程內的響應 對象。

在規範的其餘部分中還有更多類似的評論,似乎表明如果確保代碼不需要任何類型的同步,您可能會更好。

相關問題