2013-07-11 68 views
0

我使用Guice,我有一個問題。有一個是Singleton的servlet。在JVM中只有一個此類的實例還是隻有一個Session範圍的實例?併發訪問這個類怎麼樣?Guice Singleton和Servlet

回答

0

您的servlet資源會發生併發訪問問題。 Servlet容器會很好地處理它,它會在每次請求時產生新的線程,並傳遞該servlet的引用和請求將被處理。

它可以讓你的servlet單線程確認單個內存空間的使用,所以容器將是輕量級的。在Spring中可用的相同概念默認情況下每個bean都是單例。

0

我不知道吉斯,但容器可以確保只有一個的Servlet實例每個JVM存在每個定義的DD,按照規範,除非你的servlet實現了邪惡SingleThreadModel。容器將爲每個request產生一個新線程,調用service()方法。

此外,類和實例變量將不是線程安全的。只有局部變量纔是線程安全的。

0

其實吉斯要求的servlet,它設法是單身:

注:每次的servlet(或過濾器)必須是@Singleton。如果您不能直接註釋該類,則必須使用(Singleton.class)中的bind(..)。(與filter()或servlet()規則分開來綁定它。在任何其他範圍下映射都是錯誤的。這是爲了保持與Servlet規範的一致性。 Guice Servlet不支持已棄用的SingleThreadModel。

(從this documentation

你有責任正確處理併發訪問。

+0

我將如何處理併發訪問? – kodmanyagha

+0

這一切都取決於您的應用程序。該框架將允許多個請求同時訪問該servlet。你需要確保你的servlet所做的是安全的。我建議閱讀Brian Goetz的實踐中的_Java Concurrency,以獲得一個好的概述。 – condit