public class Singleton {
private Singleton() {
}
public static class LazyHolder {
static final Singleton INSTANCE = new Singleton();
static {
System.out.println("LazyHolder.<clinit>");
}
}
public static Object getInstance(boolean flag) {
if (flag) {
return new LazyHolder[2];
}
return LazyHolder.INSTANCE;
}
public static void main(String[] args) {
getInstance(true);
System.out.println("------");
getInstance(false);
}
}
$ java -cp /path/to/asmtools.jar org.openjdk.asmtools.jdis.Main Singleton$LazyHolder.class > Singleton$LazyHolder.jasm.1
$ awk 'NR==1,/stack 1/{sub(/stack 1/, "stack 0")} 1' Singleton$LazyHolder.jasm.1 > Singleton$LazyHolder.jasm
$ java -cp /path/to/asmtools.jar org.openjdk.asmtools.jasm.Main Singleton$LazyHolder.jasm
$ java -verbose:class Singleton
- if(flag)会导致LazyHolder的加载吗?会导致它的初始化吗?
不会加载LazyHolder,不会初始化
- 新建数组会导致LazyHoler的链接吗?
新建数组不会链接LazyHolder,在getIncetance(false)时才是真正链接和初始化
\