ロックが取得され、さらにロックを試行してもブロックされません。C# のロックは再入可能でしょうか? 質問する

ロックが取得され、さらにロックを試行してもブロックされません。C# のロックは再入可能でしょうか? 質問する

デッドロックの有効なケースと思われるテストを作成しました。 が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のロックは再入可能です。他のスレッドからの取得のみがブロックされます。同じスレッドが同じオブジェクトを複数回ロックすると、単にカウンタが増分され、解放されると減分されます。カウンタがゼロになると、ロックは実は他のスレッドからのアクセスのために解放されました。

おすすめ記事