2011-05-06 61 views
4

靜態對象僅初始化一次。單例類只實例化一次。如果我們在集羣中使用單例,那麼它將在集羣中創建多個單例的實例。 那麼集羣環境中的靜態對象會發生什麼? 爲什麼在其他羣集服務器中未初始化此對象?或爲什麼對象狀態不會改變?羣集時如何處理靜態對象?

+0

重複的http://stackoverflow.com/questions/5909799/caching-mechanism-cluster-environment/5910303#5910303 – 2011-05-06 10:55:54

回答

3

靜態對象始終在ClassLoader的範圍內(大多數情況下是每個JVM),並且在集羣中不被視爲。如果你需要一個Singleton,你必須告訴容器創建一個。 這取決於你的Singleton的本質,如果它應該只存在於每個集羣一個或每個JVM一次或每個Classloader一次。

3

集羣中的每個節點都運行在單獨的JVM中 - 因此每個JVM(集羣節點)都將擁有它自己的Singleton。如果將集羣視爲JVM的系統,則集羣中單例的實例數等於節點數。

集羣範圍的單例不能用普通的Java類實現。您可能需要提供單例的單個(未集羣)服務器實例。

2

在單個進程中,單例甚至不可靠。您可以通過多個類加載器加載同一個類,並最終生成多個「單例」對象。

單身是一種反模式的原因 - 避免它

由於所有節點必須進行協調以決定單身人員的位置,所以在集羣中情況更糟。這很容易受到網絡分區的影響,因此是站不住腳的。布魯爾的CAP Theorem會給你一些背景。

+0

像往常一樣,它取決於用例。通常在某個範圍內(即,每個ClassLoader)具有「Singleton」就足夠了,例如,用於緩存一些數據。在這種情況下效率可能較低,因爲不是所有人都可以看到完整的緩存,並且可能包含冗餘或甚至不同的數據,但是如果知道限制條件,則可以應用該模式。 – rurouni 2011-05-06 11:08:02