質問

最近の回答の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);

私の観察は真実ですか? 「はい」の場合、どうすればこの状況を回避できますか(例:待機とロールバックのタイミング)?

役に立ちましたか?

解決

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top