繁体   English   中英

这个代码是正确的线程安全Singleton设计模式的例子吗?

[英]Is this code correct example of thread safe Singleton design pattern?

下面的代码是正确的Java中线程安全的Singleton模式的例子吗?

    class Singleton {
    private static Singleton INSTANCE = new Singleton();

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

由于静态成员初始化,只有一次,在JVM类加载时保证是线程安全的,所以这不是上面代码示例的线程安全Singleton类(早期加载)?

上述陈述有什么问题吗? 如果是,那么将其转换为线程安全的Singleton类需要进行哪些最小的更改?

这可以保证JLS安全。 请参阅持有者模式 :“由于JLS保证类初始化阶段是顺序的,即非并发,因此在加载和初始化期间静态getInstance方法不需要进一步同步。”

持有者模式比你想要的更复杂,但重要的是static final Something INSTANCE = new Something()无论在哪个类中被声明都是安全的。持有者模式与你拥有的模式相比的好处是单例在第一次使用之前不会被初始化。 如果要在初始化Singleton实例的成本很高的情况下访问Singleton类中的其他静态成员,这将非常有用。

正如Lewis_McReuuser6690200指出的那样,您应该声明INSTANCE字段final ,以确保您不会意外地为变量分配不同的Singleton实例。 您还应该声明一个私有的无参数Singleton()构造函数,以防止创建其他实例。 为了使其更加防弹,您应该声明Singletonfinal以便您不能使用public构造函数对其进行子类化。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM