我试图找出以下MC问题的答案。我尝试在Google上寻找答案,但人们似乎对此问题有不同的答案。有人可以解释他们的答案吗?

public class Gingleton {
    private static Gingleton INSTANCE = null;

    public static Gingleton getInstance()
    {
        if ( INSTANCE == null )
        {
            INSTANCE = new Gingleton();
        }
        return INSTANCE;
    }

    private Gingleton() {
    }
}
  • 可以创建多个Gingleton实例(我的选择)
  • 永远不会创建Gingleton
  • 构造函数是私有的,不能称为
  • 值可以被垃圾回收,并且对getInstance的调用可能
    返回垃圾数据
  • 最佳答案

    getInstance()中的新实例创建不会以任何方式同步,因此有可能在多线程环境中创建多个实例。为了确保只有一个实例,您应该执行以下操作:

    public class Gingleton {
    
        // volatile
        private static volatile Gingleton INSTANCE = null;
    
        public static Gingleton getInstance()
        {
            if ( INSTANCE == null )
            {
                synchronized (Gingleton.class) {  // Synchronized
                    if ( INSTANCE == null )
                    {
                        INSTANCE = new Gingleton();
                    }
                }
            }
            return INSTANCE;
        }
    
        private Gingleton() {
        }
    }
    

    10-08 19:55