【发布时间】: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