Heim >Backend-Entwicklung >C++ >Warum wird `lock (this)` in Multithread C# entmutigt?
Warum lock(this)
in Multithread C#
Die Dokumentation von Microsoft berät die Verwendung von lock(this)
zum Schutz des Objektzugriffs, wenn dieses Objekt öffentlich zugänglich ist. Lassen Sie uns die Gründe für diese Empfehlung untersuchen.
Schlüsselrisiken für die Verwendung lock(this)
:
Unkontrolliertes Sperren: öffentlich zugängliche Objekte bedeuten Jeder Code kann die Sperre für this
erwerben. Dies öffnet die Tür zu unvorhersehbaren Synchronisationsproblemen und macht Multithread -Code deutlich schwieriger zu entwerfen und korrekt zu debuggen.
Verstöße gegen die Kapselung: wird im Allgemeinen bevorzugt. Dieser Ansatz erzwingt die Zugangskontrolle und hält den Verriegelungsmechanismus in interner und erhaltener Einkapselung. lock(this)
enthält die Verriegelungsimplementierung und beeinträchtigt dieses entscheidende Designprinzip.
Missverständnis von lock
Verhalten: Ein häufiges Missverständnis ist, dass lock(this)
das Objekt irgendwie schreibgeschützt macht. Das ist falsch. Das Objekt fungiert nur als Sperre Schlüssel . Wenn ein anderer Thread das Schloss hält, werden nachfolgende Versuche blockiert, aber das Objekt selbst bleibt verändert.
Verriegelung an unveränderlichen Typen: Wenn Sie niemals unveränderliche Typen wie Zeichenfolgen blockieren. Diese werden häufig in der Anwendung geteilt, was zu Deadlocks oder unerwartetem Verhalten führt. Verwenden Sie stattdessen ein privates, veränderliches Objekt (wie eine dedizierte object
Instanz).
Illustratives Beispiel:
Betrachten Sie diesen C# Code:
<code class="language-csharp">public class Person { public int Age { get; set; } public string Name { get; set; } public void LockThis() { lock (this) { System.Threading.Thread.Sleep(10000); // Simulate a long operation } } }</code>
Dieses Beispiel zeigt das Problem. Während LockThis()
die Sperre auf this
hält, könnte ein anderer Thread Name
gleichzeitig ändern, was demonstriert, dass lock(this)
nicht inhärent eine Änderung verhindert. Dieser Mangel an garantierter Schutz ist der Grundgrund für die Warnung.
Das obige ist der detaillierte Inhalt vonWarum wird `lock (this)` in Multithread C# entmutigt?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!