2011-05-25 67 views
2

注:這個問題是在Gamma94描述不約辛格爾頓類(確保只有一個對象曾經被實例化。)Guice:爲什麼必須@ Singleton註釋的類不可變/線程安全?

我看Guice documentation關於@Singleton屬性:

Classes annotated @Singleton and @SessionScoped must be threadsafe. 

這種情況下,即使我不打算從多個線程訪問該對象?如果是這樣,爲什麼?

+0

「線程安全」意味着對象的行爲與預期相同,即使同時由2個或更多線程訪問。現在,如果您100%確定您的對象只能由一個線程訪問(例如,因爲您的整個應用程序是單線程的),那麼它將在應用程序的上下文中自動進行線程安全。 – jfpoilpret 2011-05-25 21:59:02

回答

7

如果一個對象只能從一個線程訪問,它不需要是線程安全的,即使它是一個Guice @Singleton。 Guice在內部不執行任何多線程,可能會導致非線程安全單例中斷...構建Injector的過程全部在調用Guice.createInjector的線程上完成,並且任何動態預配都在調用provider.get()的線程上完成。當然,一個singleton只會被創建一次,然後在每次需要時返回......創建它時取決於它是否被綁定爲一個渴望的單身(始終在啓動時創建)以及是否創建了InjectorStage.DEVELOPMENT(僅在需要時創建)或Stage.PRODUCTION(在啓動時創建)。

雖然(特別是在web應用程序中),通常情況下singletons可以從多個線程同時訪問,因此是警告。雖然很多開發人員都會明白,在這種情況下單身人士應該是線程安全的,但其他人可能不會,我認爲值得警惕的是他們。

+0

謝謝科林。如果他們在文檔中留下那些看似明顯的通用編程建議(以確保要通過多線程訪問的類被設計爲可以這樣做),它會爲我省去很多困惑。 – 2011-05-26 03:23:29

+0

@glenviewjeff:使單線程線程化,安全是合理的建議。如果文檔中說Singletons必須在Guice的上下文中是線程安全的,那麼你最好讓它們線程安全。否則,你基本上違反了他們的合同,他們不能保證你的代碼會按預期行事。單線程很容易讓線程安全,所以你可以這樣做。 – 2011-05-26 05:04:10

+0

@羅伯特,我就是這麼想的,如果吉斯這麼說,我最好聽聽這個建議,直到我得到一個更明確的答案和解釋。問題在於使單線程線程安全並不像你想象的那麼容易,因爲我調用了一個(有點模糊的)ORM,而且我不確定這些方法的線程安全性。 – 2011-05-26 19:30:02

相關問題