Nebenwirkungen des Auslösens einer Ausnahme innerhalb einer synchronisierten Klausel?

Lesezeit: 1 Minute

Benutzer-Avatar
Yossale

Gibt es unklare Nebenwirkungen beim Auslösen einer Ausnahme innerhalb einer synchronisierten Klausel? Was passiert mit dem Schloss?

private void doSomething() throws Exception {...}

synchronized (lock) {   
    doSomething();       
}

Benutzer-Avatar
KLE

Ich sehe keine Nebenwirkung.

Das Die Sperre wird garantiert aufgehoben in allen Fällen, und eine Ausnahme ist keine Ausnahme (Wortspiel beabsichtigt).

  • +1 für den Beweis, dass eine Ausnahme manchmal keine Ausnahme ist :-))

    – Andreas Dölk

    7. Januar 2010 um 10:05 Uhr

  • @KLE was ist mit einem Fehler? Was passiert, wenn der Code Stackoverflow oder OutOfMemory auslöst?

    – Schrittmacher

    13. Februar 2012 um 13:26 Uhr

  • Diese Seite ist auch einen Blick wert, nur zur Info.

    – imnd_neel

    20. Februar 2014 um 13:32 Uhr


  • Wie die Final-Klausel!

    – minmaxavg

    4. Oktober 2016 um 3:59 Uhr

  • Im Falle eines verschachtelten synchronisierten Blocks auf 2 verschiedenen Objekten, wenn eine Ausnahme innerhalb des inneren synchronisierten Blocks ausgelöst wird, wird die Sperre von beiden Objekten aufgehoben?

    – Sparkon

    11. April 2021 um 5:06 Uhr

Wie Sie hoffen würden, wird die Sperre normal freigegeben.

Als Referenz dient der entsprechende Abschnitt des JLS, der dieses Verhalten garantiert § 14.19:

Wenn die Ausführung des Blocks normal abgeschlossen wird, wird die Sperre entsperrt und die synchronisierte Anweisung wird normal abgeschlossen. Wenn die Ausführung des Blocks aus irgendeinem Grund abrupt abgeschlossen wird, wird die Sperre aufgehoben und die synchronisierte Anweisung wird dann aus demselben Grund abrupt abgeschlossen.

(„Abrupter Abschluss“ ist an anderer Stelle im JLS definiert, um Ausnahmen von JVM einzuschließen, Ausnahmen, die von ausgelöst werden throwund Verwendung der break, continueoder return Anweisungen, die außerhalb des Blocks übertragen werden sollen.)

  • wenn doSomething(); wirft einen java.lang.StackOverflowError was passiert?

    – Schrittmacher

    13. Februar 2012 um 13:27 Uhr

1186060cookie-checkNebenwirkungen des Auslösens einer Ausnahme innerhalb einer synchronisierten Klausel?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy