类初始化时机的问题。
来源:8-4 单例设计模式-静态内部类-基于类初始化的延迟加载解决方案及原理解析
new_chapter
2019-03-19
public class Singleton {
private static Singleton singleton = new Singleton();
private Singleton() {}
public static Singleton getSingleton() {
return singleton;
}
}
这种方式为什么不是懒加载呢?不是只有访问到getSingleton这个static的方法时,才初始化吗?
类的初始化情况有:
- 遇到 new, getstatic, putstatic 或 invokestatic 这四条字节码指令时,如果类没有进行初始化,则需要触发初始化
- 使用java.lang.reflect包的方法进行反射调用时
- 当初始化一个类,如果发现其父类还没有初始化,先初始化父类
- 当虚拟机启动时,用户指定一个要执行的主类,虚拟机会先初始化这个主类
写回答
1回答
-
q_秋白
2019-03-19
private static Singleton singleton = new Singleton();
在这一句当中singleton是作为一个静态成员变量的,一个静态成员变量当且仅当类初次被加载当时候完成初始化。所以在加载类Singleton的时候就已经完成了它的初始化,而不是调用getSingleton()才完成初始化
。因此这是饿汉式。012019-03-21
相似问题