##
7.5.2 RLock オブジェクト

再入可能ロックは同じスレッドによって複数回獲得される同期プリミティブです。 それは内部に、プリミティブロックによって使われるロック/アンロック状態 に加えて、``所有スレッド''と``再帰レベル''の概念を使います。 ロック状態ではあるスレッドがロックを所有し、 アンロック状態ではどのスレッドもそれを所有しません。

ロックすると、スレッドはその`acquire()`メソッドを呼びます。 いったんスレッドがロックを所有すると返ります。 アンロックすると、スレッドはその`release()`メソッドを呼びます。 `acquire()`/`release()`呼び出しペアはネストされるべきです。 最後の`release()`だけは(最も外側のペアの`release()`)は ロックをアンロック状態へリセットします。 そして`acquire()`でブロックされた別のスレッドが進むことを許可します。

`acquire`( | [blocking`= 1`])

  ブロックまたは非ブロックのロックを獲得します。

  引数なしで呼び出されたとき: もしこのスレッドが既にロックを所有する場合、 それによって再帰レベルをインクリメントし、直ちに返ります。 一方、別のスレッドがロックを所有する場合、アンロックされるまでブロックします。 いったんそのロックがアンロックされた(どのスレッドによっても所有されていない) とき、所有権を掴み、再帰レベルを1にセットし、返ります。 1つ以上のスレッドが、そのロックがアンロックされるのを待ち、 ブロックされているとき、ただ1つのスレッドがロックの所有権を掴むことができます。 この場合、返り値はありません。

  blocking引数がTrueにセットされて呼び出されたとき、 引数無しで呼び出したときと同じように動作し、trueを返します。

  blocking引数がFalseにセットされて呼び出されたとき、ブロックしません。 もし引数無しの呼び出しにおいてブロックされるような状況ならば、 直ちにFalseを返します; そうでない状況ならば、引数無しの呼出しと同じように動作して、 Trueを返します。

`release`( | )

  ロックを解放し、再帰レベルをデクリメントします。 デクリメントの後にそれが0になるならば、ロックをアンロックします (他のスレッドによって所有されていない場合)。 そして他のスレッドがブロックされていたならば、 それらのうちの1つに進むことを許可します。 デクリメントの後も再帰レベルが非0であるならば、引続きロック状態であり 呼出しスレッドによって所有されている。

  呼出しスレッドがロックを所有しているとき、単にこのメソッドを呼出してください。 アンロック状態のとき、このメソッドを呼出してはいけません。

  返り値はありません。