静态内部类不会随着外部类的加载和初始化而初始化,它是要单独去加载和初始化的
因为是在内部类加载和初始化时创建的,因此线程是安全的
public class SingletonTest3 {
private SingletonTest3() {
}
/**
* 静态内部类
*
*/
private static class SingletonHold{
private static SingletonTest3 sTest3 = new SingletonTest3();
}
public static SingletonTest3 getSingleton() {
return SingletonHold.sTest3;
}
public static void main(String[] args) {
SingletonTest3 s1 = SingletonTest3.getSingleton();
SingletonTest3 s2 = SingletonTest3.getSingleton();
System.out.println(s1.equals(s2)); //true
}
}
当第一次加载外部类时,不会去加载静态类,只有当调用getSingleton()方法时候才会去初始化。这种方法不仅能确保线程安全,也能保证单例的唯一性,同时也延迟了单例的实例化。因此静态内部类这种方法大多应用于有明确的lazy loading(延迟加载)需求时。