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