1
は、私は、メモリリソースへのアクセスを制限する理論セマフォの例を与えた:単一のJavaセマフォのデッドロック?私の最近の答えの一つで
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);
私の観察は正しいですか?はいの場合は、どうすればこのような状況を回避できますか(たとえば、待機時間とロールバックのタイミング)?
ありがとう。私は、例外の場合のロールバックの方法にもっと興味を持っていました。サンプルの場合は簡単です。リリースして1行目に戻り、再試行してください。しかし、スレッド内の割り当てがより遠くにある場合(例えば、高価な計算を取り囲む)、どちらも助けにならないことが懸念されます。たぶん、私はより粗い粒度のロックスキーマに戻すべきでしょうか? – akarnokd
もっと複雑な例を詳しく説明しなければなりませんが、1つのアプローチはすべての関連する*リソースをロールバックして再試行することです。他のタスクを許可するために、完了する機会が増えます。 –