在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的缺陷吗?