2013-03-17 81 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