这是忽略多线程的有效单例吗?

时间:2019-07-03 17:06:45

标签: java static singleton private

import java.util.*;
import java.lang.*;
import java.io.*;

class Logger {
    private static final Logger logger = new Logger();
    private static final String test = "value";
    private Logger() {
        System.out.println("Called Constructor!");
    }
    public static Logger getLogger() {
        return logger;
    }
}

class Ideone
{
    public static void main (String[] args) throws java.lang.Exception
    {
        Logger logger;
        Logger logger2 = Logger.getLogger();
    }
}

除了了解上面的代码是否为单例代码外,我还有其他疑问。

Q1)创建变量logger时为什么不调用私有构造函数,而当我调用函数getLogger()时为什么要调用私有构造函数?

Q2)什么时候分配test变量的值?在私有构造函数调用之前还是之后?

谢谢!

2 个答案:

答案 0 :(得分:1)

是的,这是正确的单例,并且是线程安全的。

  

当我创建变量记录器时,为什么不调用私有构造函数,而当我调用函数getLogger()时,为什么要调用私有构造函数?

因为声明变量除了声明变量外没有其他作用。它不会调用任何方法,也不会创建任何对象。

  

何时分配测试变量的值?在私有构造函数调用之前还是之后?

同时,在初始化类时。

答案 1 :(得分:0)

这是正确的单例:

  

当我创建变量记录器时,为什么不调用私有构造函数,而当我调用函数getLogger()时,为什么要调用私有构造函数?

Soo ..当您声明一个变量时,您要做的是保留内存空间,而不是用记录器初始化它,而是在记录器类中静态声明Logger实例时,Java在运行时初始化了它,然后在您调用getLogger只是将指针提供给该Logger实例。

  

何时分配测试变量的值?在私有构造函数调用之前还是之后?

在构造函数被调用之后。