Является ли синхронизированное ключевое слово безопасным от исключений?

Возможный дубликат:
Побочные эффекты бросания исключения внутри синхронизированного предложения?

Мне интересно, если synchronized исключение безопасно? Скажем, в синхронизированном блоке происходит необработанное исключение, будет ли снята блокировка?

6 ответов

В случае сомнений проверьте спецификацию языка Java. В разделе 17.1 вы найдете:

Если выполнение тела метода когда-либо завершается, как обычно, так и внезапно, на этом же мониторе автоматически выполняется действие разблокировки.

  1. Синхронизация не является ни потокобезопасной, ни не поточно-безопасной. То, как вы сформулировали вопрос, просто не имеет смысла.
  2. В случае исключения замок будет снят.

Только System.exit препятствует нормальному выходу блока. Это значит finally блоки не вызываются и блокировки не снимаются.

private static final Object lock = new Object();

public static void main(String... args) throws ParseException {
    Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
        @Override
        public void run() {
            System.out.println("Locking");
            synchronized (lock) {
                System.out.println("Locked");
            }
        }
    }));
    synchronized (lock) {
        System.exit(0);
    }
}

печать

Locking

и висит.:|

Да, объект станет разблокированным, если исключение выброшено и не перехвачено.

Вы можете найти несколько примеров кода здесь.

Да, это будет.

Как примечание стороны, try-finally конструкция обеспечит выполнение блока finally при выходе из try

try {
    someFunctionThatMayThrow();
} finally {
    willAlwaysBeExecuted();
}

Да, это будет. Основной смысл ключевого слова синхронизации заключается в упрощении многопоточного кодирования.

Другие вопросы по тегам