同期された句内から例外をスローすることによる不明確な副作用はありますか?ロックはどうなりますか?
private void doSomething() throws Exception {...}
synchronized (lock) {
doSomething();
}
副作用はありません。
ロックは必ず終了するであり、例外は例外ではありません(意図的なしゃれ)。
ご想像のとおり、ロックは正常に解除されます。
参考までに、この動作を保証するJLSの適切なセクションは §14.19 です。
ブロックの実行が正常に完了すると、ロックが解除され、同期されたステートメントが正常に完了します。ブロックの実行が何らかの理由で突然完了すると、ロックが解除され、同期されたステートメントが同じ理由で突然完了します。
(「突然の完了」は、JLSの他の場所で定義され、JVMからの例外、throw
によって発生した例外、break
、continue
、またはreturn
ステートメントをブロックの外に転送します。)