我正试图找出以下MC问题的答案。我试着在谷歌上寻找答案,但人们对这个问题似乎有不同的答案。有人能解释一下他们的答案吗。
public class Gingleton {
private static Gingleton INSTANCE = null;
public static Gingleton getInstance()
{
if ( INSTANCE == null )
{
INSTANCE = new Gingleton();
}
return INSTANCE;
}
private Gingleton() {
}
}发布于 2014-03-09 12:54:24
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() {
}
}发布于 2014-03-09 13:00:50
如果出现某些争用条件,可以创建多个实例(每个JVM) (可能是偶然的)。
这段代码实际上反映了一种“懒惰的单例模式”,即在首次访问JVM时创建的每个JVM只有一个实例。
=>乍一看只能有一次它的实例。但是,由于代码不是同步的,这部分代码可能会在多线程环境中并行执行几次。
if ( INSTANCE == null )
{
INSTANCE = new Gingleton();
}另见此处的评论
Singleton pattern with combination of lazy loading and thread safety
singleton pattern in java. lazy initialization
所以我想说,这是个糟糕的问题,你可以狠狠抨击MC作者的脑袋,因为:
=> True,给出了上面的讨论,但问题的作者可能并不是这么想的。
=> errr,嗯,在这个代码段中,getInstance()从来没有被调用过,没有创建任何实例。但作者可能想到,我们可以称之为这种方法,在这种情况下,答案是肯定的。
私有构造函数可以称为..。只是不是从外面来的。同样,提交人并没有提出这个问题,但我们可以假设他(她)只是“从外部”来考虑这个案件。
啊,这个声明至少是很清楚的。不,静态字段不会被垃圾收集,您可以依赖它的值。
https://stackoverflow.com/questions/22282333
复制相似问题