类初始化时机的问题。

来源: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的方法时,才初始化吗?

类的初始化情况有:

  1. 遇到 new, getstatic, putstatic 或 invokestatic 这四条字节码指令时,如果类没有进行初始化,则需要触发初始化
  2. 使用java.lang.reflect包的方法进行反射调用时
  3. 当初始化一个类,如果发现其父类还没有初始化,先初始化父类
  4. 当虚拟机启动时,用户指定一个要执行的主类,虚拟机会先初始化这个主类
写回答

1回答

q_秋白

2019-03-19

private static Singleton singleton = new Singleton();

在这一句当中singleton是作为一个静态成员变量的,一个静态成员变量当且仅当类初次被加载当时候完成初始化。所以在加载类Singleton的时候就已经完成了它的初始化,而不是调用getSingleton()才完成初始化
。因此这是饿汉式。

0
1
new_chapter
首先,感谢你的回答。 在饿汉式那一节,给力老师指出了只有用final关键字修饰,才会保证在类加载的时候去初始化单例。并且我也在问题中列出了初始化的时机。所以我认为这个还是一个懒汉式。 那么,用内部类的好处在哪里呢?
2019-03-21
共1条回复

Java设计模式精讲-Debug方式+内存分析

系统学习设计原则,设计模式,锤炼编码内功,赢取高薪Offer

3430 学习 · 407 问题

查看课程