2013-06-05 13 views
-2

我想通過這種方式來使用Singleton模式:分析JVM Singleton模式被修建爲一個常數

public static final XXX INSTANCE = new XXX(); 

    private XXX() {} 

你可以分析從JVM的角度後果?

+1

你試過了嗎?你遇到過任何問題嗎? – Makoto

+0

沒有。唯一的問題是你將無法延遲加載它。但對大多數物體來說這不是必需的。 – Thihara

+0

除了下面提到的多線程問題之外,請注意,在Java中,同一個類可能會在同一個VM中多次加載(例如,在Web服務器中的單獨WAR中,如果類不是'存在於服務器的類路徑中)。 Java中的單例不能保證是這樣的,所以要小心你使用它們的方式。 –

回答

2

如果您有多線程應用程序,則可能會遇到問題。這篇文章可能有幫助。 Thread Safe Singleton

+0

Hogwash。在任何用戶線程運行之前,靜態常量將在類加載時初始化。 – amalloy

+0

@amalloy:線程?你的意思是建議這種模式是線程安全的嗎?如果是這樣,當且僅當該值不可變時,這纔是真的。 – scottb

+0

很顯然,如果他在構造單例後嘗試從多個線程調用mutator方法,他將遇到問題,就像使用線程訪問任何對象一樣。但是問題在於初始化它,並且由於他不試圖延遲加載它,tkcsam提到的線程是無關緊要的。 – amalloy

2

將單例初始化爲最終靜態字段是安全的。您需要牢記的是,雖然構造本身是線程安全的,但並不會加強內部代碼的安全性。

有時單身人士是解決問題的正確方法,但我會鼓勵你遠離他們。 It makes usually testing harder, if nothing else.