2013-03-17 87 views
1

this博客:辛格爾頓溶液

清單10中的代碼不使用同步,並確保 的Singleton對象不被創建,直到呼叫被以靜態 getInstance()方法制成。

是不是上面的報價是假的?由於靜態對象是在類的早期初始化的,因此在調用靜態方法之前,該對象是如何創建的?

+7

'getInstance()'是該類的'static'-context中唯一可用的方法。對於它的執行,靜態初始化(因此創建對象)將被執行。因此,在調用靜態方法之前不會創建任何對象。 – 2013-03-17 00:15:27

回答

4

在問題中引用的代碼基本上是這樣的:

class Singleton { 
    private static Singleton instance = new Singleton(); 

    public static Singleton getInstance() { 
    return instance; 
    } 
} 

線程安全的,因爲實例更是不可以偷懶初始化,而是被實例化一次上課的時候被加載。

類加載器強制它自己的同步來保證類初始化是線程安全的。

+1

+1我更喜歡'枚舉Singleton',因爲它更簡單恕我直言。 – 2013-03-17 00:22:58

+0

@PeterLawrey我認爲枚舉單例模式是濫用枚舉(雖然它工作)。我更喜歡靜態的內部類模式,它提供了懶惰單元加線程安全性,而不需要任何同步 - 這是神奇的。 – Bohemian 2013-03-17 00:45:59

+0

您應該使'instance'最終確保對所有線程的最新可見性。 – 2013-03-17 01:15:17