(来自维基百科)
//惰性初始化:
public class Singleton {
private static volatile Singleton instance = null;
private Singleton() { }
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class){
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
//热切初始化:
public class Singleton {
private static final Singleton instance = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return instance;
}
}
“如果程序使用类,但可能不是单例实例本身,那么您可能需要切换到惰性初始化。”
1 - 不确定我明白了。为什么程序不应该使用类?为什么我不能通过添加属性/方法来解决它?常量引用应该如何改变?
2 - 在惰性初始化中 - 假设多线程发生,同步 getInstance() 而不是代码块(摆脱双重检查)将如何影响我的程序?
谢谢。
最佳答案
1 - 您的应用程序可能包含各种 jar,但您不一定会使用每个 jar 中的所有功能。此外,您的应用程序的用户可能不会使用您内置的所有功能。例如,如果您有一个 ReportABug 类,他们可能永远不会从菜单中激活该功能,因为您是一个非常棒的程序员 ;-)
静态字段/方法在运行时需要该类之前不会被实例化/调用,因此您的 ReportABug 类可能有 1000 个静态字段,但祈祷吧,它们永远不会消耗任何内存,因为该类永远不会被加载。
他们的观点是具有单例(或多个)的类可能具有其他不访问单例的静态方法。
2 - 您可以将方法与 Singleton 类对象同步,但每次调用 getInstance 都会产生开销,仅检查 instance == null(这是一个机器周期)要便宜得多。另一个线程可能会抢占您的线程并在外部 ==null 检查后创建实例,因此这两个测试都是必需的。
关于java - 2 关于单例模式/渴望初始化和同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11921878/