此代码是线程安全单例设计模式的正确示例吗?



在下面的代码下方正确的java中线程singleton模式的示例?

    class Singleton {
    private static Singleton INSTANCE = new Singleton();
    public static Singleton getInstance() {
        return INSTANCE;
    }
}

由于静态成员是初始化的,在JVM上课时只有一次,它保证是线程安全的,因此,这不会在上面的代码示例上进行线程Safe Safe Singleton类(早期加载(?

上述语句有什么问题吗?如果是,那么将其转换为线程Safe Singleton类所需的最小更改?

JLS保证这是安全的。请参阅"持有人"模式:"由于JLS保证了类初始化阶段是顺序的,即非互惠,因此在加载和初始化过程中,在静态GetInstance方法中不需要进一步的同步。"

>' 。"

持有人的模式比您想要的要复杂,但重要的是static final Something INSTANCE = new Something()无论是哪个类别。初始化直到第一次使用。如果您想访问Singleton类中的其他静态成员,那么初始化Singleton实例很昂贵。

正如Lewis_mcreu和User6690200指出的那样,您应该声明INSTANCE字段final,以确保您不会意外地将其他Singleton实例分配给变量。您还应该声明一个私有的no-argument Singleton()构造函数,以防止创建其他实例。为了使其更具防弹性,您应该声明Singletonfinal,以便无法使用public构造函数子类。

最新更新