class Singleton {
private static Singleton instance;
public int f1 = 1; // 触发部分初始化问题
public int f2 = 2;
private Singleton(){}
public static Singleton getInstance() {
if (instance == null) { // 当instance不为null时,可能指向一个“被部分初始化的对象”
synchronized (Singleton.class) {
if ( instance == null ) {
instance = new Singleton();
}
}
}
return instance;
}
}
如上,在多线程并发的情况下,会导致getIntance()获取到一个部分初始化的对象吗?
我看博文说初始化大致分成3个过程:
1)分配空间
2)初始化对象
3)将对象指向空间
而这3个过程会重排序,导致对象先指向空间,在判断instance==null时返回false,则实际上对象并未初始化值
难道java没有保证实例化对象的原子性?