72

同期句内から例外をスローすると、不明な副作用がありますか? ロックはどうなるの?

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

synchronized (lock) {   
    doSomething();       
}
4

2 に答える 2

108

副作用は見られません。

ロックはすべての場合に終了することが保証されており、例外は例外ではありません (しゃれが意図されています)。

于 2010-01-07T09:40:28.013 に答える
44

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

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

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

(「突然の完了」は、JVMからの例外、によって発生した例外、およびブロック外に転送するための、、、またはステートメントの使用を含むように、JLSの他の場所で定義されています。throwbreakcontinuereturn

于 2010-01-07T10:23:32.317 に答える