7

ReentrantLock を使用すると、同じスレッドが同じロックを複数回取得できるようになります。内部的には、ロック取得回数をカウントするカウンタを持っています。同じロックを 2 回取得した場合は、2 回解放する必要があります。しかし、私の質問は、なぜ誰かがロックを複数回取得したいのですか?1回の取得で十分でしょうか? 誰かが私に一般的なユースケースを教えてもらえますか?

4

4 に答える 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 に答える