647 Stimmen

Was macht eine Sperrerklärung unter der Haube?

Ich sehe, dass wir bei der Verwendung von Objekten, die nicht thread-sicher sind, den Code mit einer Sperre wie dieser verpacken:

private static readonly Object obj = new Object();

lock (obj)
{
    // thread unsafe code
}

Was passiert also, wenn mehrere Threads auf denselben Code zugreifen (nehmen wir an, er wird in einer ASP.NET-Webanwendung ausgeführt). Stehen sie in einer Warteschlange? Wenn ja, wie lange werden sie warten?

Welche Auswirkungen auf die Leistung hat die Verwendung von Sperren?

10voto

Mr47 Punkte 2626

Der Teil innerhalb der Sperranweisung kann nur von einem Thread ausgeführt werden, so dass alle anderen Threads auf unbestimmte Zeit warten müssen, bis der Thread, der die Sperre hält, fertig ist. Dies kann zu einem sogenannten Deadlock führen.

9voto

Paolo Tedesco Punkte 52228

El lock Anweisung wird übersetzt in Aufrufe der Enter y Exit Methoden der Monitor .

El lock Anweisung wartet auf unbestimmte Zeit darauf, dass das sperrende Objekt freigegeben wird.

4voto

Euphoric Punkte 12272

sperren ist eigentlich versteckt Monitor Klasse.

1voto

Saeed Aghdam Punkte 197

Selon Microsofts MSDN ist die Sperre gleichbedeutend mit:

object __lockObj = x;
bool __lockWasTaken = false;
try
{
    System.Threading.Monitor.Enter(__lockObj, ref __lockWasTaken);
    // Your code...
}
finally
{
    if (__lockWasTaken) System.Threading.Monitor.Exit(__lockObj);
}

Wenn Sie während der Laufzeit Sperren erstellen müssen, können Sie die Open-Source DynaLock . Sie können zur Laufzeit neue Sperren anlegen und mit dem Kontextkonzept Grenzen für die Sperren festlegen.

DynaLock ist Open-Source und der Quellcode ist verfügbar unter GitHub

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X