1

Можно создать дубликат:
Side effects of throwing an exception inside a synchronized clause?Является ли синхронизированное ключевое слово безопасным для исключений?

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

+0

В любом защищенном от резьбы блоке, в тот момент, когда вы выходите из него, безопасность нити не проходит. – srkavin

+0

Вы имеете в виду «Является ли' synchronized' construct * exception-safe *? "? –

ответ

0

Да, это будет. Основной момент ключевого слова synchronize - упростить многопоточное кодирование.

+0

http://stackoverflow.com/questions/8375172/java-synchronization-and-exception-handling занимается этим конкретным случаем. –

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

+1 - Первая часть вопроса бессмысленна. OP - просмотрите определение «потокобезопасность». –

9

При возникновении сомнений проверьте Java Language Specification. В разделе 17.1 вы найдете:

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

0

Да, объект будет разблокирован, если исключение будет выброшено и не будет обнаружено.

Вы можете найти некоторые code examples here.

0

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

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

try { 
    someFunctionThatMayThrow(); 
} finally { 
    willAlwaysBeExecuted(); 
} 
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 

и виснет. : |

 Смежные вопросы

  • Нет связанных вопросов^_^