Według specyfikacji języka lock(obj) statement;
będą kompilowane jako:Jaka jest zaleta Monitor.Enter (obiekt, ref bool) nad Monitor.Enter (obiekt)?
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);
}
Jednak jest kompilowany jako:
try
{
object lockObj = obj;
bool lockTaken = false;
Monitor.Enter(lockObj, ref lockTaken);
statement;
}
finally
{
if (lockTaken) Monitor.Exit(lockObj);
}
, który wydaje się być o wiele bardziej skomplikowana, niż to konieczne. Pytanie brzmi: jaka jest zaleta tej implementacji?
Już miałem odpowiedzieć sobie, gdy pomyślałem o innej odpowiedzi, która została niestety usunięta, zanim mogłem ją skomentować. Pomyślałem o tym, kiedy można rzucić wyjątki, przerwać wątki w dowolnym miejscu itd. Było oczywiste, że 'Monitor.Enter' może pomyślnie powrócić, ale zanim wątek wejdzie w blok' try', może zostać przerwany. Czasami ta strona jest zbyt szybka, aby uhonorować wszystkich ludzi, którzy pomogli znaleźć odpowiedź. – Wormbo