靜態對象僅初始化一次。單例類只實例化一次。如果我們在集羣中使用單例,那麼它將在集羣中創建多個單例的實例。 那麼集羣環境中的靜態對象會發生什麼? 爲什麼在其他羣集服務器中未初始化此對象?或爲什麼對象狀態不會改變?羣集時如何處理靜態對象?
4
A
回答
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
相關問題
- 1. Android處理靜態數據庫對象
- 2. Hornetq靜態集羣配置
- 3. 如何動態處理java對象?
- 4. 何時包括處理靜態函數?
- 5. 你如何處理集羣中基於時間的事件?
- 6. 靜態對象
- 7. '靜態' 對象
- 8. CLR如何處理靜態類?
- 9. 如何處理靜態最終變量
- 10. 如何在執行對象列表時處理動態分配?
- 11. 集羣中的靜態變量訪問
- 12. 如何處理對象
- 13. 如何處理googlemap對象?
- 14. 通過靜態IP代理Kubernetes集羣的傳出流量
- 15. 靜態WCF代理類對象
- 16. C++/CLI靜態型扣對象會導致未處理的運行時異常
- 17. 靜態類對象
- 18. ASP.Net靜態對象
- 19. 時區處理對象
- 20. 如何在靜態方法中引用非靜態對象
- 21. 如何使繼承的靜態對象
- 22. 如何結合ViewModel和靜態對象
- 23. 如何給json對象的靜態值?
- 24. 如何在編譯DLL到靜態庫時處理DLL_EXPORT?
- 25. 如何在使用IOC時處理靜態類別
- 26. 處理靜態內容(CSS)
- 27. 處理靜態列表
- 28. C++ - 非本地靜態對象vs本地靜態對象
- 29. 正確處理大量對象集合
- 30. Python - timedelta對象何時被處理?
重複的http://stackoverflow.com/questions/5909799/caching-mechanism-cluster-environment/5910303#5910303 – 2011-05-06 10:55:54