1

私の最近の回答の 1 つで、メモリ リソースへのアクセスを制限する理論的なセマフォの例を示しました。

public static byte[] createArray(int size) throws InterruptedException {
    semaphore.acquire(size);
    return new byte[size];
}
public static void releaseArray(byte[] array) {
    semaphore.release(array.length);
}

割り当てインターリーブが悪い場合、これがデッドロックの原因になる可能性があると思います。

semaphore = new Sempaphore(30, true);
// T1                                 T2
//--------------------------          ----------------------
a1 = createArray(10);                                           // 20
                                      a3 = createArray(10);     // 10
a2 = createArray(15);                                           // wait
                                      a4 = createArray(15);     // wait
// ...                                // ...
releaseArray(a1);                     releaseArray(a3);
releaseArray(a2);                     releaseArray(a4);

私の観察は本当ですか?はいの場合、どうすればこの状況を回避できますか (時間指定待機やロールバックなど)?

4

1 に答える 1

2

はい、Semaphore.tryAcquire(permits, timeout, timeUnit)ここで使用するのが賢明です。finally明らかに、リークを避けるためにブロック内のセマフォを解放するように注意する必要があります...

于 2009-07-30T09:23:48.070 に答える