言語仕様によると、次のlock(obj) statement;
ようにコンパイルされます。
object lockObj = obj; // (the langspec doesn't mention this var, but it wouldn't be safe without it)
Monitor.Enter(lockObj);
try
{
statement;
}
finally
{
Monitor.Exit(lockObj);
}
ただし、次のようにコンパイルされます。
try
{
object lockObj = obj;
bool lockTaken = false;
Monitor.Enter(lockObj, ref lockTaken);
statement;
}
finally
{
if (lockTaken) Monitor.Exit(lockObj);
}
それは必要以上に複雑なようです。問題は、その実装の利点は何ですか?