web-dev-qa-db-ja.com

同期された句内で例外をスローすることの副作用?

同期された句内から例外をスローすることによる不明確な副作用はありますか?ロックはどうなりますか?

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

synchronized (lock) {   
    doSomething();       
}
64
Yossale

副作用はありません。

ロックは必ず終了するであり、例外は例外ではありません(意図的なしゃれ)。

91
KLE

ご想像のとおり、ロックは正常に解除されます。

参考までに、この動作を保証するJLSの適切なセクションは §14.19 です。

ブロックの実行が正常に完了すると、ロックが解除され、同期されたステートメントが正常に完了します。ブロックの実行が何らかの理由で突然完了すると、ロックが解除され、同期されたステートメントが同じ理由で突然完了します。

(「突然の完了」は、JLSの他の場所で定義され、JVMからの例外、throwによって発生した例外、breakcontinue、またはreturnステートメントをブロックの外に転送します。)

39
Cowan