请问为什么双检锁不成立?
Topic source这个问题比较复杂,与其纠结这个问题,不如思考如何把代码写得更简洁。
懒加载其实没啥用,因为你实测一下代码:
public class Singleton {
static {
System.out.println("init Singleton class...");
}
private static Singleton instance = createInstance();
private static Singleton createInstance() {
System.out.println("create singleton instance...");
return new Singleton();
}
private Singleton() {
}
public static Singleton getInstance() {
return instance;
}
}
用:
Singleton s = null;
System.out.println(Singleton.class);
s = Singleton.getInstance(); // create singleton instance...
System.out.println(s);
你会发现高版本的JVM加载class并没有初始化静态变量,直到第一次调用getInstance()才会执行createInstance()方法,也就是JVM本身就是懒加载static变量的
廖老师,我用
Class.forName("Singleton");
加载这个Singleton类,控制台输出
init Singleton class...
create singleton instance...
这是不是意味着没有懒加载啊,用的JDK14
- 1
发愤图强的大悟
由于Java的内存模型,双重检查在这里不成立。
廖神可以详细解释一下为什么双检锁不成立吗?项目里经常用双检锁的方式写懒加载单例....有的文章中说为了避免指令重排序导致的空指针,双检锁的懒加载单例还应该加上 volatile 关键字。