いいえ、同じオブジェクトをロックしている限りではありません。再帰コードは事実上既にロックを取得しているため、妨げられずに続行できます。
lock(object) {...}
Monitorクラスを使用するための省略形です。Marc が指摘しているように、再入Monitor
可能であるため、現在のスレッドが既にロックしているオブジェクトを繰り返しロックしようとしても問題なく動作します。
別のオブジェクトをロックし始める場合は、注意が必要です。以下に特に注意してください。
- 同じシーケンス内の指定された数のオブジェクトのロックを常に取得します。
- ロックを取得する方法とは常に逆の順序でロックを解放してください。
これらのルールのいずれかを破ると、ある時点でデッドロックの問題が発生することがほぼ保証されます。
.NET でのスレッド同期について説明している 1 つの優れた Web ページを次に示します。
また、一度にロックするオブジェクトはできるだけ少なくしてください。可能であれば、粒度の粗いロックを適用することを検討してください。オブジェクトグラフがあり、そのオブジェクトグラフのルートでロックを取得できるようにコードを記述できる場合は、そうするという考えです。これは、そのルート オブジェクトに 1 つのロックがあることを意味するため、ロックを取得/解放する順序についてあまり心配する必要はありません。
(さらに注意してください。あなたの例は技術的に再帰的ではありません。再帰的にBar()
するには、通常、反復の一部としてそれ自体を呼び出す必要があります。)