现在百度云资源那里找➕幑
作者:互联网
从这个例子看,似乎对程序结果看不出有什么影响。我们再看一个经典的面试题,也是工作中经常接触到的模式——单例模式。
如果在面试的时候让我们手写一个单例模式,我相信大多数同学都能信手拈来,例如用双重检验锁实现:
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