デッドロックの有効なケースと思われるテストを作成しました。 がlock
クラスのインスタンスによって取得されると、再度取得lock
する必要がある別のメソッドを明示的に呼び出そうとしても、そのインスタンスは を再取得する必要がないようですlock
。
クラスは次のとおりです:
internal class Tester
{
private readonly object _sync = new object();
public Tester() { }
public void TestLock()
{
lock (_sync)
{
for (int i = 0; i < 10; i++)
{
Deadlock(i);
}
}
}
private void Deadlock(int i)
{
lock (_sync)
{
Trace.WriteLine(i + " no deadlock!");
}
}
}
出力:
0 デッドロックなし!
1 デッドロックなし!
2 デッドロックなし!
3 デッドロックなし!
4 デッドロックなし
! 5 デッドロックなし
! 6 デッドロック
なし! 7 デッドロックなし!
8 デッドロックなし!
9 デッドロックなし!
これはデッドロックを引き起こすだろうと思いましたが、誰かこれについて説明できますか?
ベストアンサー1
.NETのロックは再入可能です。他のスレッドからの取得のみがブロックされます。同じスレッドが同じオブジェクトを複数回ロックすると、単にカウンタが増分され、解放されると減分されます。カウンタがゼロになると、ロックは実は他のスレッドからのアクセスのために解放されました。