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();
}
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();
}
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
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 throw
und Verwendung der break
, continue
oder 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