重複の可能性:
同期句内で例外をスローすることの副作用?
synchronized
例外セーフかどうか疑問に思っていますか? たとえば、同期ブロック内でキャッチされない例外が発生した場合、ロックは解除されますか?
重複の可能性:
同期句内で例外をスローすることの副作用?
synchronized
例外セーフかどうか疑問に思っていますか? たとえば、同期ブロック内でキャッチされない例外が発生した場合、ロックは解除されますか?
不明な点がある場合は、 Java 言語仕様を確認してください。セクション17.1では、次のことがわかります。
メソッド本体の実行が正常に完了した場合でも突然完了した場合でも、同じモニターでロック解除アクションが自動的に実行されます。
System.exit のみが、ブロックが正常に終了するのを防ぎます。これは、finally
ブロックが呼び出されず、ロックが解放されないことを意味します。
private static final Object lock = new Object();
public static void main(String... args) throws ParseException {
Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Locking");
synchronized (lock) {
System.out.println("Locked");
}
}
}));
synchronized (lock) {
System.exit(0);
}
}
版画
Locking
そしてハングします。:|
はい、そうなります。synchronize キーワードの主なポイントは、マルチスレッド コーディングを容易にすることです。
はい、例外がスローされてキャッチされない場合、オブジェクトはロック解除されます。
ここでいくつかのコード例を見つけることができます。
はい、そうなります。
補足として、try-finally
コンストラクトは、try が終了したときに finally ブロックが実行されることを保証します。
try {
someFunctionThatMayThrow();
} finally {
willAlwaysBeExecuted();
}