2

openJDK源代码中,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;
 }

IMO,此实现缺少双重检查锁定,例如不存在块内的null 测试。synchronized在这种情况下,假设有 2 个线程,线程 I 进入synchronized 监视器,同时线程 II 巧合地在同一个synchronized 监视器上被阻塞,因此,线程 II 也将有机会再次调用cons = sun.misc.SharedSecrets.getJavaIOAccess().console();来初始化 Console 对象

问题:为什么在这种情况下没有正确使用双重检查锁定?这真的是openJDK的缺陷吗?

4

1 回答 1

0

这很可能是因为Console返回的对象已经sun.misc.SharedSecrets.getJavaIOAccess().console()初始化为静态块单例。可能发生的最坏情况是cons再次设置为同一件事。

理想吗?可能不是。是故意的吗?也许。会不会产生副作用?我不这么认为。

于 2018-11-14T02:03:48.510 回答