Является ли синхронизированное ключевое слово безопасным от исключений?
Возможный дубликат:
Побочные эффекты бросания исключения внутри синхронизированного предложения?
Мне интересно, если synchronized
исключение безопасно? Скажем, в синхронизированном блоке происходит необработанное исключение, будет ли снята блокировка?
6 ответов
В случае сомнений проверьте спецификацию языка Java. В разделе 17.1 вы найдете:
Если выполнение тела метода когда-либо завершается, как обычно, так и внезапно, на этом же мониторе автоматически выполняется действие разблокировки.
- Синхронизация не является ни потокобезопасной, ни не поточно-безопасной. То, как вы сформулировали вопрос, просто не имеет смысла.
- В случае исключения замок будет снят.
Только 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();
}
Да, это будет. Основной смысл ключевого слова синхронизации заключается в упрощении многопоточного кодирования.