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

hua*_*hui 3 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();    
    }    
}  
Run Code Online (Sandbox Code Playgroud)

Tom*_*ine 24

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

代码应如下所示:

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

    public static Singleton getInstance() {    
        return SingletonHolder.instance;    
    }    
}
Run Code Online (Sandbox Code Playgroud)

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

像往常一样[可变的]单身人士是一个非常糟糕的主意.

  • @TomHawtin-tackline 你可以添加一个私有的单例构造函数`private Singleton() {}` 来完成这个例子。 (2认同)

Dao*_*Wen 6

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

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

初始化按需持有人习语

  • 操作代码绝对不安全...... (2认同)