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

时间:2018-02-12 12:14:02

标签: java multithreading singleton

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

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

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

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

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

1 个答案:

答案 0 :(得分:2)

JLS保证这是安全的。请参阅the holder pattern:"由于JLS保证类初始化阶段是顺序的,即非并发,因此在加载和初始化期间静态getInstance方法不需要进一步同步。"

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

Lewis_McReuuser6690200指出时,您应该声明INSTANCE字段final,以确保您不会意外分配不同的Singleton Singleton() 1}}变量的实例。您还应该声明一个私有的无参数Singleton构造函数,以防止创建其他实例。为了使其更具防弹性,您应该声明finalpublic,以便您不能使用 constructor( private route: ActivatedRoute, ) { } ngOnInit() { this.route.params.subscribe(params => { // put the logic of your component here }); } 构造函数对其进行子类化。