【发布时间】:2018-07-15 21:10:27
【问题描述】:
以下两种在java中延迟初始化线程安全单例的方法是否正确?有性能差异吗?如果不是,那我们为什么要使用 Holder 模式(Singleton2)而不是像 Singleton1 那样保持简单?
提前致谢。
class Singleton1 {
private Singleton1() {
System.out.println("Singleton1-Constructor");
}
private static final Singleton1 inst1 = new Singleton1();
public static Singleton1 getInst1() {
return inst1;
}
}
class Singleton2 {
private Singleton2() {
System.out.println("Singleton2-Constructor");
}
public static class Holder {
private static final Singleton2 holderInst = new Singleton2();
}
public static Singleton2 getInst2() {
return Holder.holderInst;
}
}
public class App {
public static void main(String[] args) {
Singleton1.getInst1(); // without this statement the Singleton1 constructor doesnt get called.
Singleton2.getInst2(); // without this statement the Singleton2 constructor doesnt get called.
}
}
【问题讨论】:
-
您的第二个选项
Singleton2允许您在不触发实例构造的情况下执行其他静态方法(如果有的话)。但是,通常Holder类是private static,并且您在单例类上使用public static方法公开实例。至少我一直都是这么看的。 -
对于那些认为它重复的人......请看下面 Pietro Boido 提供的解释。建议的帖子中没有人以同样的方式解释它。有些人需要更多的解释,所以请不要因为你认为已经有类似的问题被问过而扼杀问题。谢谢,
-
This answer to the possible duplicate 回顾了 Pietro Boido 在他的回答中所说的内容。不过,我会说我认为 Pietro 更直接。
标签: java multithreading thread-safety singleton lazy-initialization