System.console()中可能存在JDK错误

yua*_*ang 5 java

以下代码来自java.lang.System.console()方法:

private static volatile Console cons = null;

/**
 * Returns the unique {@link java.io.Console Console} object associated
 * with the current Java virtual machine, if any.
 *
 * @return  The system console, if any, otherwise <tt>null</tt>.
 *
 * @since   1.6
 */
 public static Console console() {
     if (cons == null) {
         synchronized (System.class) {
             cons = sun.misc.SharedSecrets.getJavaIOAccess().console();
         }
     }
     return cons;
 }
Run Code Online (Sandbox Code Playgroud)

在我看来,这是这种方法的一个错误.我们应该这样写:

public static Console console() {
     if (cons == null) {
         synchronized (System.class) {
            if (cons == null)
                 cons = sun.misc.SharedSecrets.getJavaIOAccess().console();
         }
     }
     return cons;
 }
Run Code Online (Sandbox Code Playgroud)

我对吗?你怎么看?

Tag*_*eev 3

如果您查看 的实现JavaIOAccess您会发现其中有一个空检查:

public Console console() {
    if (istty()) {
        if (cons == null)
            cons = new Console();
            return cons;
        }
    return null;
}
Run Code Online (Sandbox Code Playgroud)

由于此方法是初始化该变量的唯一方法,因此嵌套空检查驻留在另一个方法中并不是问题。获得两个不同的Console物体仍然是不可能的。