Почему двойная проверка блокировки не используется должным образом в реализации System.console () в openJDK? - PullRequest
0 голосов
/ 14 ноября 2018

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

1 Ответ

0 голосов
/ 14 ноября 2018

Вероятно, потому что Console объект, возвращаемый sun.misc.SharedSecrets.getJavaIOAccess().console(), уже инициализирован как статический одиночный блок в любом случае. Худшее, что может случиться, это то, что cons снова настроен на то же самое.

Это идеально? Возможно нет. Это намеренно? Может быть. Это вызовет побочные эффекты? Я так не думаю.

...