2010-03-31 87 views

回答

28

javadoc說明了原因。 SingleThreadModel被設計成一個簡單的解決方案,以低負載併發性,但它甚至沒有管理的是:

注意SingleThreadModel並沒有提供 解決所有的線程安全問題。對於 例如,會話屬性和靜態變量 仍然可以通過在多個線程 多個請求同時訪問,即使使用 了SingleThreadModel的servlet。 建議顯影劑 採取其他手段來解決,而不是實現此 接口,如避免使用一個實例變量的 或 同步訪問這些資源的代碼 的塊那些 問題。

如果無法達到設計目的,則不應使用。

11

這基本上是一種很差的處理併發的方式。相反,請將狀態從您的servlet中取出,以便多個線程可以同時使用同一個servlet。將狀態保持在servlet實例的「池」中,每個實例都可以具有從先前請求中遺留下來的狀態,這非常可怕。

1

從Java Servlet規範:

           使用SingleThreadModel接口保證只有一個 在一個時間線將在一個給定的servlet實例的服務 方法執行的。值得注意的是,這個保證只適用於每個servlet實例的 ,因爲容器可能會選擇合併這樣的對象。一次可以訪問多個servlet實例 的對象(例如HttpSession實例)可以在特定時間到達多個servlet,包括實現 SingleThreadModel的那些。
           建議顯影劑採取其他手段來解決這些問題,而不是實現該接口,如避免 一個實例變量的使用或同步 代碼訪問這些資源的塊的。 SingleThreadModel接口在本版本的規範中已棄用 。

4

是不推薦使用SingleThreadModel接口。不要使用它。事實上,你並不需要它,而是使用局部變量而不是對象字段,因爲「每個線程都在Java中獲取自己的局部變量副本。通過簡單地刪除對象字段並用局部變量替換它,這個特定的線程問題已解決。「 Reference

相關問題