単一のJavaセマフォのデッドロック?
-
05-07-2019 - |
質問
最近の回答の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
ブロックでセマフォを解放するように注意する必要があります...
所属していません StackOverflow