首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >私有构造函数和实例-多项选择

私有构造函数和实例-多项选择
EN

Stack Overflow用户
提问于 2014-03-09 12:46:08
回答 2查看 835关注 0票数 3

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

代码语言:javascript
复制
public class Gingleton {
    private static Gingleton INSTANCE = null;

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

    private Gingleton() {
    }
}
  • 可以创建多个Gingleton实例(我的选择)
  • 金格尔顿永远不会被创造出来
  • 构造函数是私有的,不能调用
  • 值可以被垃圾收集,而对getInstance的调用可能返回垃圾数据。
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-03-09 12:54:24

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

代码语言:javascript
复制
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() {
    }
}
票数 5
EN

Stack Overflow用户

发布于 2014-03-09 13:00:50

如果出现某些争用条件,可以创建多个实例(每个JVM) (可能是偶然的)。

这段代码实际上反映了一种“懒惰的单例模式”,即在首次访问JVM时创建的每个JVM只有一个实例。

=>乍一看只能有一次它的实例。但是,由于代码不是同步的,这部分代码可能会在多线程环境中并行执行几次。

代码语言:javascript
复制
if ( INSTANCE == null )
    {
        INSTANCE = new Gingleton();
    }

另见此处的评论

Singleton pattern with combination of lazy loading and thread safety

singleton pattern in java. lazy initialization

所以我想说,这是个糟糕的问题,你可以狠狠抨击MC作者的脑袋,因为:

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

=> True,给出了上面的讨论,但问题的作者可能并不是这么想的。

  • 金格尔顿永远不会被创造出来

=> errr,嗯,在这个代码段中,getInstance()从来没有被调用过,没有创建任何实例。但作者可能想到,我们可以称之为这种方法,在这种情况下,答案是肯定的。

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

私有构造函数可以称为..。只是不是从外面来的。同样,提交人并没有提出这个问题,但我们可以假设他(她)只是“从外部”来考虑这个案件。

  • 值可以被垃圾收集,而对getInstance的调用可能返回垃圾数据。

啊,这个声明至少是很清楚的。不,静态字段不会被垃圾收集,您可以依赖它的值。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22282333

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档