java创建对象是否会出现部分初始化情况?

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没有保证实例化对象的原子性?

阅读 1.6k
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题