学习单例模式时经常会看到说饿汉式单例模式浪费资源,懒汉式单例在调用时才初始化,不浪费资源;真是这样么?
类的初始化是在类加载时进行的,而类加载的时机是首次主动引用:
- 通过调用new创建对象
- 访问类的静态变量
- 访类的静态方法
- 对某个类进行反射操作
- 初始化子类
- 启动类,执行main方法的类
一般一个恶汉式单例:
public final class Singleton {
private static final Singleton INSTANCE = new Singleton();
private Singleton(){}
public static Singleton getInstance() {
return INSTANCE;
}
public void method1(){
}
public void method2(){
}
}
实际使用时需要先调用getInstance方法(再调用具体的methods),进而触发Singleton的加载、连接、初始化,不调用不会触发初始化的,就不会浪费资源,只有Singleton类里面有其他静态方法,或者对类进行反射时才会导致资源浪费,而实际使用中基本不会这么做,所以说实际中饿汉式单例不一定会浪费资源,大多场景下饿汉式单例是比较优秀的实现。