Gli effetti collaterali di un'eccezione all'interno di una clausola di sincronizzato?
-
19-09-2019 - |
Domanda
Ci sono effetti collaterali poco chiari a un'eccezione all'interno di una clausola sincronizzato? Cosa succede al blocco?
private void doSomething() throws Exception {...}
synchronized (lock) {
doSomething();
}
Soluzione
Non vedo alcun effetto collaterale.
bloccaggio è garantito essere terminato in tutti i casi, e un'eccezione è un'eccezione (gioco di parole).
Altri suggerimenti
Come si spera, il blocco viene rilasciato normalmente.
Per riferimento, la sezione del GLS che garantisce questo comportamento è § 14.19 :
Se l'esecuzione del blocco completa normalmente, poi la serratura è sbloccato e la dichiarazione sincronizzato completa normalmente. Se l'esecuzione del blocco completa bruscamente, per qualsiasi motivo, allora il blocco è sbloccato e la dichiarazione sincronizzato completa quindi bruscamente per lo stesso motivo.
( 'completamento brusca' è definito altrove nel JLS per includere eccezioni JVM, le eccezioni sollevate da throw
, e l'uso delle break
, continue
, o dichiarazioni return
da trasferire al di fuori del blocco.)