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