java - 私有(private)构造函数和实例 - 多项选择

标签 java singleton

我正在尝试找出以下 MC 问题的答案。我曾尝试在谷歌上寻找答案,但人们似乎对这个问题有不同的答案。有人可以解释他们的答案吗?

public class Gingleton {
    private static Gingleton INSTANCE = null;

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

    private Gingleton() {
    }
}
  • 可以创建多个 Gingleton 实例(我的选择)

  • 永远不会创建 Gingleton

  • 构造函数是私有(private)的,不能调用

  • 值可以被垃圾回收,调用 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() {
    }
}

关于java - 私有(private)构造函数和实例 - 多项选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22282333/

相关文章:

java - spring 中的单例作用域 bean,我如何使其成为非线程安全

ruby - Ruby Matrix 类的复制/继承(核心/标准库)

java - 自 Java 5 以来最好的单例模式

java - 在进度对话框中嵌套警报对话框

java - 在 Clojure 中为 Java 返回值使用类型提示

Java:使用replaceAll()替换字符串中的所有URL(URL包含 '\')

java - "Cannot find symbol"或 "Cannot resolve symbol"错误是什么意思?

java - 我的 Firestore 项目集合中的文档重复

C#/.NET 如何在单例中测试 protected 方法?

javascript - 在 CoffeeScript 中为我的单例类定义属性 getter