1

重複の可能性:
同期句内で例外をスローすることの副作用?

synchronized例外セーフかどうか疑問に思っていますか? たとえば、同期ブロック内でキャッチされない例外が発生した場合、ロックは解除されますか?

4

6 に答える 6

9

不明な点がある場合は、 Java 言語仕様を確認してください。セクション17.1では、次のことがわかります。

メソッド本体の実行が正常に完了した場合でも突然完了した場合でも、同じモニターでロック解除アクションが自動的に実行されます。

于 2011-12-06T00:39:30.230 に答える
2
  1. Synchronize は、スレッドセーフでも非スレッドセーフでもありません。あなたの質問の言い方には意味がありません。
  2. 例外が発生した場合、ロックは解放されます。
于 2011-12-06T00:39:21.300 に答える
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

そしてハングします。:|

于 2011-12-06T08:21:59.257 に答える
0

はい、そうなります。synchronize キーワードの主なポイントは、マルチスレッド コーディングを容易にすることです。

于 2011-12-06T00:39:03.877 に答える
0

はい、例外がスローされてキャッチされない場合、オブジェクトはロック解除されます。

ここでいくつかのコード例を見つけることができます。

于 2011-12-06T00:40:07.750 に答える
0

はい、そうなります。

補足として、try-finallyコンストラクトは、try が終了したときに finally ブロックが実行されることを保証します。

try {
    someFunctionThatMayThrow();
} finally {
    willAlwaysBeExecuted();
}
于 2011-12-06T00:40:31.847 に答える