2009-07-30 5 views
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); 

私の観察は正しいですか?はいの場合は、どうすればこのような状況を回避できますか(たとえば、待機時間とロールバックのタイミング)?

答えて

2

はい、Semaphore.tryAcquire(permits, timeout, timeUnit)を使用すると、ここで賢明なことになります。明らかに、漏れを避けるために、finallyブロックのセマフォを解放するよう注意しなければなりません。

+0

ありがとう。私は、例外の場合のロールバックの方法にもっと興味を持っていました。サンプルの場合は簡単です。リリースして1行目に戻り、再試行してください。しかし、スレッド内の割り当てがより遠くにある場合(例えば、高価な計算を取り囲む)、どちらも助けにならないことが懸念されます。たぶん、私はより粗い粒度のロックスキーマに戻すべきでしょうか? – akarnokd

+0

もっと複雑な例を詳しく説明しなければなりませんが、1つのアプローチはすべての関連する*リソースをロールバックして再試行することです。他のタスクを許可するために、完了する機会が増えます。 –

関連する問題