Nebenwirkungen der eine Ausnahme in einer synchronisierten Klausel zu werfen?
-
19-09-2019 - |
Frage
Gibt es unklar, Nebenwirkungen zu werfen eine Ausnahme innerhalb eines synchronisierten Klausel? Was passiert mit dem Schloss?
private void doSomething() throws Exception {...}
synchronized (lock) {
doSomething();
}
Lösung
Ich sehe keine Nebenwirkung.
Die Sperre garantiert beendet werden in allen Fällen und eine Ausnahme macht da keine Ausnahme (Wortspiel beabsichtigt).
Andere Tipps
Wie Sie würden hoffen, wird die Sperre aufgehoben normal.
Als Referenz in dem entsprechenden Abschnitt des JLS, die dieses Verhalten gewährleistet ist § 14.19 :
Wenn die Ausführung des Blocks normalerweise abgeschlossen ist, dann ist das Schloss entriegelt und die synchronisierte Anweisung abgeschlossen ist normal. Wenn die Ausführung des Blocks abrupt aus irgendeinem Grund beendet ist, dann das Schloss entriegelt und die synchronisierte Anweisung schließt dann abrupt aus dem gleichen Grund.
( ‚abrupte Beendigung‘ definiert wird an anderer Stelle in der JLS Ausnahmen von JVM umfasst, Ausnahmen von throw
angehoben, und die Verwendung der break
, continue
oder return
Aussagen außerhalb des Blocks zu übertragen.)