其他分享
首页 > 其他分享> > 现在百度云资源那里找➕幑

现在百度云资源那里找➕幑

作者:互联网

从这个例子看,似乎对程序结果看不出有什么影响。我们再看一个经典的面试题,也是工作中经常接触到的模式——单例模式。

 

如果在面试的时候让我们手写一个单例模式,我相信大多数同学都能信手拈来,例如用双重检验锁实现:

 

class A {

 

}

 

 

示例:1-1

public class Singleton {

    private static Singleton INSTANCE;

    private Singleton(){}

    public static Singleton getSingleton() {

        if (INSTANCE == null) {

            synchronized (Singleton.class) {

                if (INSTANCE == null) {

                    INSTANCE = new Singleton();

                }

            }

        }

        return INSTANCE;

    }

}

写完这段代码,似乎好像完成了面试官要求的单例模式。一切看上去似乎很顺利,内心窃喜,这时候面试官可能会问你,你觉得这段代码有什么问题吗?问题就出现在 new Singleton();。

 

对于 CPU 来说创建这个对象,会有三个 CPU 指令:

 

分配内存空间

初始化对象

INSTANCE 引用指向分配好的内存空间

但是重排序后执行顺序可能为 1-3-2,那么问题就来了,这时候引用指向了堆内存的一块地址,但是对象还没有初始化完成。

 

如果这时候有其它线程进来,发生了时间片切换,判断引用 INSTANCE 不等于 null,这时候返回了未初始化完成的对象,这时候使用该对象就会出问题。

标签:Singleton,那里,这时候,INSTANCE,百度,单例,null,class,资源
来源: https://www.cnblogs.com/ibdjb/p/13388974.html