Java 杂谈

彻底搞懂双重检查单例模式

2018-10-02  本文已影响16人  编程界的小学生

一、源码

public class SingletonExample4 {

    private volatile static SingletonExample4 instance = null;

    private SingletonExample4() {}

    public static SingletonExample4 getInstance() {
        if (instance == null) {
            synchronized (SingletonExample4.class) {
                if (instance == null) {
                    instance = new SingletonExample4();
                }
            }
        }
        return instance;
    }
}

二、为什么需要加volatile才可以?

因为:
1、先说下new Object()在底层是几步骤

2、再说下为什么需要volatile
因为JVM指令重排序。
若3.和2.被重排序换位置了,那结果是先分配内存空间,然后指向,最后初始化对象。那么我们这时候虽然是有synchronize,但是两次进入都发现没有初始化对象,因为他指向内存分配的空间了,尚未初始化对象。

三、广告

上一篇下一篇

猜你喜欢

热点阅读