为什么静态内部类单例线程安全

时间:2013-07-23 01:13:58

标签: java

正如标题所说,为什么静态嵌套类单例线程安全?

public class Singleton    
{    
    private static class SingletonHolder    
    {    
        public static Singleton instance = null;
        public static Singleton getInstance(){
            if (null == instance) {
                instance = new Singleton();
            }
        }    
    }    

    public static Singleton getInstance()    
    {    
        return SingletonHolder.getInstance();    
    }    
}  

2 个答案:

答案 0 :(得分:22)

您显示的代码在技术上不是线程安全的。这种狡猾的代码经常会被破坏。

代码应如下所示:

public class Singleton  {    
    private static class SingletonHolder {    
        public static final Singleton instance = new Singleton();
    }    

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

这里我们在静态初始化程序(SingletonHolder)中进行分配,任何线程都可以通过正确的发生在之前的关系来查看它。嵌套类没有什么特别之处,它只允许在不立即构造单例对象的情况下使用外部类。几乎可以肯定,这完全是毫无意义,但它似乎取悦了一些人。

一如既往[可变]单身人士是非常糟糕的想法。

答案 1 :(得分:6)

它是线程安全的,因为JVM处理延迟加载嵌套类。

但是,您发布的代码似乎没有正确使用此模式(您不应该进行空检查),我认为这实际上打破了线程的安全性。这是一篇很好的文章,您可以在其中详细了解此模式的工作原理以及如何正确使用它:

Initialization-on-demand holder idiom