ロックステートメントは内部で何を行うのでしょうか? 質問する

ロックステートメントは内部で何を行うのでしょうか? 質問する

スレッドセーフではないオブジェクトを使用する場合は、次のようにコードをロックでラップすることがわかります。

private static readonly Object obj = new Object();

lock (obj)
{
    // thread unsafe code
}

では、複数のスレッドが同じコードにアクセスするとどうなるでしょうか (ASP.NET Web アプリケーションで実行されていると仮定します)。スレッドはキューに入れられますか? キューに入れられる場合、どれくらい待機するのでしょうか?

ロックを使用することでパフォーマンスにどのような影響がありますか?

ベストアンサー1

このlockステートメントは、C# 3.0 によって次のように変換されます。

var temp = obj;

Monitor.Enter(temp);

try
{
    // body
}
finally
{
    Monitor.Exit(temp);
}

C# 4.0ではこれは変わったそして、次のように生成されます。

bool lockWasTaken = false;
var temp = obj;
try
{
    Monitor.Enter(temp, ref lockWasTaken);
    // body
}
finally
{
    if (lockWasTaken)
    {
        Monitor.Exit(temp); 
    }
}

Monitor.Enter何が起こっているのか、さらに詳しく知りたい場合は、ここMSDN を引用すると:

Enterパラメータとして渡されたオブジェクトのモニターを取得するために使用します。別のスレッドがEnterオブジェクトに対して を実行したが、対応する をまだ実行していない場合Exit、現在のスレッドは、他のスレッドがオブジェクトを解放するまでブロックされます。同じスレッドがEnterブロックせずに複数回呼び出すことは可能ですが、オブジェクトを待機している他のスレッドのブロックを解除するには、同じ回数のExit呼び出しを呼び出す必要があります。

メソッドMonitor.Enterは無限に待機します。タイムアウトは発生しません。

おすすめ記事