ReentrantLock を使用すると、同じスレッドが同じロックを複数回取得できるようになります。内部的には、ロック取得回数をカウントするカウンタを持っています。同じロックを 2 回取得した場合は、2 回解放する必要があります。しかし、私の質問は、なぜ誰かがロックを複数回取得したいのですか?1回の取得で十分でしょうか? 誰かが私に一般的なユースケースを教えてもらえますか?
質問する
5972 次
4 に答える
13
アトミックではない一連の操作が必要な次のケースを考えてみましょう。たとえば、配列の値を設定したいが、設定時に現在の値を返したい場合があります。(try-finally は簡潔にするために削除されました)。
final ReentrantLock lock = new ReentrantLock();
final Object[] objects = new Object[10]
public Object setAndReturnPrevious(int index, Object val){
lock.lock();
Object prev = get(index);
set(index,val);
return prev;
lock.unlock();
}
public void set(int index, Object val){
lock.lock();
objects[index] = val;
lock.unlock();
}
public Object get(index index){...}
ReentrantLock が再入可能でない場合、次の場所でデッドロックします。get(index)
于 2013-09-03T15:38:25.927 に答える
1
再入可能ロックは避けるべきだと主張する人もいます。クリティカル セクションでは、何が起こっているかを正確に把握する必要があります。ローカル クリティカル セクションが、ローカル コードを呼び戻す可能性のある外部コードを呼び出す可能性がある場合、それは非常に複雑で潜在的に危険に思えます。ローカル コードのみを含む、適切に定義されたクリティカル セクションをいくつか用意することをお勧めします。
于 2013-09-03T16:03:39.727 に答える