2011-07-29 18 views
3

如何在兩個或多個Classloaders和VM的情況下安全地編碼單身人士。我看到這個問題解釋在:http://java.sun.com/developer/technicalArticles/Programming/singletons/多個Classloader和VM案例中的單身人士

解決方案?

+0

您指的是什麼問題?每個類加載器的單例或每個JVM的單例或每個JVM的單個單元? –

+0

多虛擬機意味着你需要虛擬機之間的通信。有龍! –

+0

最佳解決方案:避免[可變]單例。總是。 –

回答

3

如果你想在ClassLoaders之間共享一個單例,你有一個通用的父裝載單例,或者你可以讓每個ClassLoader明確地定義你希望那個Classloader使用哪些類Singleton。

+0

您可以分享的代碼示例? – Ved

+0

嗯。不知道這是否會有所幫助,但這裏是加載和卸載類加載器的示例。 http://vanillajava.blogspot.com/2011/07/java-secret-loading-and-unloading.html要共享一個單身人士,你需要讓這個類可以被父類加載器訪問,所以它加載它。如果想在每個類加載器的基礎上進行選擇,可以重載loadClass方法。 –

2

該文章明確指出分佈式應用程序應該遠離單例。你在這裏試圖解決的任何特定問題?另外,對於持有在應用程序運行期間從不修改的常量的單例,您的「單例」的多個「實例」不應該造成問題。在其他情況下,您最好在需要它的類中注入配置(依賴注入方式)。

+0

是的,我同意你的意見。我不是想解決一個具體問題,但這是一個理論問題 – Ved

0

1)網絡套接字生存多個虛擬機

Port busy 8765 java.net.BindException: Address already in use 

2),進行文件

WARNING: Creating a new instance of CacheManager using the diskStorePath 

基於這些資源的兩個或多個類加載器和虛擬機的情況下安全地編寫單身人士(如果你真的嚴重需要堅持這種反模式)

1

注意:如果計算機有多個接口(IP),那麼同一個套接字(8765)可以綁定到所有的(所以它不是臨時萬無一失)。儘管有些情況下它們也可以隱藏,但文件比較好(例如,安裝在上面)