【问题标题】:Why is double-checked locking not used properly in the implementation of System.console() in the openJDK?为什么在 openJDK 中 System.console() 的实现中没有正确使用双重检查锁定?
【发布时间】:2018-11-14 00:48:40
【问题描述】:

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,此实现缺少 双重检查锁定,例如 synchronized 块内的 null test 不存在。在这种情况下假设有 2 个线程,线程 I 进入 synchronizedmonitor,同时线程 II 巧合地在同一个 synchronizedmonitor 上被阻塞> 这样一来,线程二也有机会再次调用cons = sun.misc.SharedSecrets.getJavaIOAccess().console();来初始化Console对象

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

【问题讨论】:

    标签: java singleton double-checked-locking system-console


    【解决方案1】:

    这可能是因为sun.misc.SharedSecrets.getJavaIOAccess().console() 返回的Console 对象无论如何都是作为静态块单例的already initialised。可能发生的最坏情况是 cons 再次设置为相同的内容。

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

    【讨论】:

      猜你喜欢
      • 2011-12-12
      • 2021-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多