Nach der Sprachspezifikation lock(obj) statement;
würde kompiliert werden:Was ist der Vorteil von Monitor.Enter (Objekt, ref bool) über Monitor.Enter (Objekt)?
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);
}
jedoch als kompiliert wird:
try
{
object lockObj = obj;
bool lockTaken = false;
Monitor.Enter(lockObj, ref lockTaken);
statement;
}
finally
{
if (lockTaken) Monitor.Exit(lockObj);
}
Das viel komplizierter als nötig zu sein scheint. Die Frage ist also, was ist der Vorteil dieser Implementierung?
Ich war im Begriff, mich selbst zu beantworten, nachdem ich über eine andere Antwort nachgedacht hatte, die leider gelöscht wurde, bevor ich sie kommentieren konnte. Ich dachte mir mehr darüber nach, wann Exceptions ausgelöst werden könnten, Threads irgendwo unterbrochen werden usw. Es war offensichtlich, dass 'Monitor.Enter' erfolgreich zurückgeliefert werden konnte, aber bevor der Thread in den' try'-Block ging, konnte er unterbrochen werden. Manchmal ist diese Seite zu schnell, um alle Leute zu ehren, die geholfen haben, die Antwort zu finden. – Wormbo