В исходном коде 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 ?