下面的代码是否是Java中线程安全的Singleton模式的正确示例?
class Singleton {
private static Singleton INSTANCE = new Singleton();
public static Singleton getInstance() {
return INSTANCE;
}
}
由于静态成员初始化,只有一次,在JVM类加载时保证是线程安全的,所以这不是上面代码示例的线程安全的Singleton类(早期加载)吗?
上述陈述有什么问题吗?如果是,那么将它转换为线程安全的Singleton类需要进行哪些最小的更改?
答案 0 :(得分:2)
JLS保证这是安全的。请参阅the holder pattern:"由于JLS保证类初始化阶段是顺序的,即非并发,因此在加载和初始化期间静态getInstance方法不需要进一步同步。"
持有者模式比你想要的更复杂,但重要的是static final Something INSTANCE = new Something()
无论宣布哪个类都是安全的。持有者模式与你拥有的模式相比的好处是singleton在第一次使用之前不会被初始化。如果您希望在初始化Singleton
实例的成本很高的情况下访问Singleton
课程中的其他静态成员,这将非常有用。
当Lewis_McReu和user6690200指出时,您应该声明INSTANCE
字段final
,以确保您不会意外分配不同的Singleton
Singleton()
1}}变量的实例。您还应该声明一个私有的无参数Singleton
构造函数,以防止创建其他实例。为了使其更具防弹性,您应该声明final
类public
,以便您不能使用 constructor(
private route: ActivatedRoute,
) { }
ngOnInit() {
this.route.params.subscribe(params => {
// put the logic of your component here
});
}
构造函数对其进行子类化。