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

标签 java

<分区>

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

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();
    }
} 

最佳答案

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

代码应该是这样的:

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

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

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

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

关于java - 为什么静态内部类单例线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17799976/

相关文章:

java - 带有分页问题的 Youtube Data API v3 java 搜索

java - 从 Java 应用程序连接到远程 GridGain 节点

java - 将不同的 URL 映射到 Web 应用程序

java - 为什么我的数组打印全零而不是范围内的所有整数?

java - Android SQLite 日期查询

java - 如何解决 java 中的 Error org.omg.CORBA.BAD_OPERATION 异常?

java - rJava加载错误

java - 在 Windows 上哪里可以找到 java 应用程序的用户配置文件?

java - 尝试从 Firebase 数据库获取数据,但总是获取空值

java - 无法让 Darkula 在 Netbeans 中以外观和感觉工作