4

セマフォ アクションを try-catch ブロックでラップする適切な方法は何ですか? 要求されたパーミットのすべてではなく一部を取得した後で取得アクションが中断された場合はどうなりますか? もう一度リリースする数をどうやって知るのですか? リリースは「最終的に」ブロックに入る必要がありますが、アクションが中断された場合に取得できなかった許可をリリースする可能性はありませんか?

try {
    lock.acquire(permits);

    //Do some things that require synchronization

    //Make sure to release all of the permits again!
    lock.release(permits);
} catch (InterruptedException e) {
    log.error("Interrupted!");
}
4

3 に答える 3

4

このSemaphore.acquire(int)メソッドは、要求されたすべての許可を取得するか、ブロックするかのいずれかで、オール オア ナッシングの操作です。コードを二重に試行するか、(可能性のある) 中断された例外を取得してコール スタックをバブルアップさせることができます。

ダブルトライブロック:

try {
    lock.acquire(permits);

    try {
        // do some stuff here
    } finally {
        lock.release(permits);
    }
} catch(final InterruptedException ie) {
    // handle acquire failure here
}

バブル「取得」例外:

lock.acquire(permits);

try {
    // do some stuff here
} finally {
    lock.release(permits);
}

接線では、セマフォは厳密なプログラミング規則によってバランスを保つ必要があることに注意してください。そのため、常に取得した数の許可を解放する必要があります。

于 2013-02-28T15:35:25.733 に答える