美文网首页Java 杂谈
彻底搞懂双重检查单例模式

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

作者: 编程界的小学生 | 来源:发表于2018-10-02 18:57 被阅读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()在底层是几步骤

    • 1.memory=allocate()分配对象的内存空间。
    • 2.createInstance()初始化对象
    • 3.instance=memory 设置instance指向刚分配的内存

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

    三、广告

    • 码云地址

      https://gitee.com/geekerdream

    • QQ群【Java初学者学习交流群】:458430385

    • 微信公众号【Java码农社区】

      img
    • 今日头条号:编程界的小学生

    相关文章

      网友评论

        本文标题:彻底搞懂双重检查单例模式

        本文链接:https://www.haomeiwen.com/subject/jijaoftx.html