8

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

public class Singleton {
    private static class SingletonHolder {
        public static Singleton instance;

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

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

2 回答 2

36

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

代码应如下所示:

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

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

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

与以往一样,[可变] 单例是一个非常糟糕的主意。

于 2013-07-23T01:20:44.140 回答
7

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

但是,您发布的代码似乎没有正确使用此模式(您不应该进行空检查),我认为这实际上破坏了线程安全。这是一篇不错的文章,您可以在其中阅读有关此模式为何有效以及如何正确使用它的更多信息:

按需初始化持有者成语

于 2013-07-23T01:21:25.657 回答