2

次の方法を想定します。

public synchronized void a(){
    try{
        System.out.println("a");
        return;
    }finally{
        System.out.println("a, finally");
    }
}

returnステートメントの後でもfinallyブロックが実行されることを理解しています。戻り値を「オーバーライド」することもできます。しかし、私の質問は、メソッドはreturnステートメントの後で、または最後にロック解除されるのでしょうか?

4

3 に答える 3

2

returnブロックが終了する前に実行されないためfinally、またメソッド全体がであるため、ブロックが終了synchronizedするまでロックは解放されませんfinally

メソッドから戻るのではなく、例外でロックを解除する必要がある場合は、ブロックを/ブロックsynchronized内にネストできます。tryfinally

public void a(){
    try {
        synchronized (this) {
            System.out.println("a");
            return;
        }
    } finally{
        System.out.println("a, finally");
    }
}
于 2012-05-24T18:35:48.933 に答える
1

まず最初に、returnステートメントの前に最終的に実行されます...。

次に、スレッドが完全なメソッドの実行を終了したときにのみロックが解放されます。つまり(このメソッドの最後の括弧まで)、さらにこのロックはオブジェクトのものであるため、このメソッドだけでなく、その中のすべての同期されたメソッドクラスはロックされています。

于 2012-05-24T18:36:31.120 に答える
0

はい、そうです。最終的にブロック実行を実行した後に発生する関数から戻るまで待機します。

于 2012-05-24T18:58:06.393 に答える