スレッドセーフではないオブジェクトを使用する場合は、次のようにコードをロックでラップすることがわかります。
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
は無限に待機します。タイムアウトは発生しません。