java - Singleton:在构造函数中抛出异常

标签 java reflection singleton

为了防止使用反射破坏 Singleton,一种方法是在私有(private)构造函数中抛出异常,如下代码所示:

public final class Foo {

    private static final Foo INSTANCE = new Foo();

    private Foo() {
        if (INSTANCE != null) {
            throw new IllegalStateException("Already instantiated");
        }
    }

    public static Foo getInstance() {
        return INSTANCE;
    }
}

上面是标准代码,但我在想的是它是线程安全的吗?如果多个线程尝试同时使用反射创建实例[即在类加载到主内存之前,这意味着实例将为 null ] 那么它们会成功吗?

最佳答案

在加载类之前,您无法访问类的静态成员(无论是直接访问还是通过反射访问)。静态最终成员在加载过程中初始化 ( step 9 of the JLS description )。

所以在你的情况下,线程不可能:

  • 在正确构建之前请参阅INSTANCE
  • INSTANCE 视为 null(除非第一次调用 new Foo() 引发异常)
  • 初始化第二个实例(除非该代码依赖 a different class loader)

关于java - Singleton:在构造函数中抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16777075/

相关文章:

Java 程序打印出 "JAVA_OPTIONS"

java - 如何在学生对象的数组列表中查找 ID

java - 我应该为我的库存系统使用静态列表吗?

go - 创建一个函数来测试从接口(interface)编码/解码

java - Android/Java - 通过反射获取隐藏类的类型

java - 通过反射在运行时获取通用字段类型

java - 单例设计模式实现

iphone - Objective-C 中用于存储和访问程序范围变量的单例。几个问题

C# 单例模式

java - 无法使用 Tomcat 6 部署 JAX-RS (Jersey 2.3.1) Web 服务