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方法は無限に待機します。それはなりませんタイムアウト。