Discuss / Java / 请问为什么双检锁不成立?

请问为什么双检锁不成立?

Topic source

由于Java的内存模型,双重检查在这里不成立。

廖神可以详细解释一下为什么双检锁不成立吗?项目里经常用双检锁的方式写懒加载单例....有的文章中说为了避免指令重排序导致的空指针,双检锁的懒加载单例还应该加上 volatile 关键字。

廖雪峰

#2 Created at ... [Delete] [Delete and Lock User]

这个问题比较复杂,与其纠结这个问题,不如思考如何把代码写得更简洁。

懒加载其实没啥用,因为你实测一下代码:

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

廖雪峰

#4 Created at ... [Delete] [Delete and Lock User]

那你就不要用Class.forName

Java的类加载器太复杂,不是几句话能讲清楚的


  • 1

Reply