|
Das Lock-Schlüsselwort markiert einen Block von Anweisungen als kritische Zone, indem ein Mutex für ein gegebenes Objekt genommen, die Anweisung ausgeführt und dann die Sperre freigegeben wird.
Die Lock-Anweisung verwendet im Grunde Monitor.Enter und Monitor.Exit, das heißt, Monitor.Enter(this) wird ausgeführt, wenn lock(this) ausgeführt wird, und Monitor.Exit(this) wird am Ende des Curly-Krassels ausgeführt. Was bedeutet sie? Für jedes Objekt ist der erste Teil des Speichers die Adresse aller Methoden, der zweite Teil ein Index. Er zeigt auf einen SyncBlock im SyncBlock-Cache-Bereich der CLR. Was bedeutet das? Das heißt, wenn Sie Monitor.Enter(Object) ausführen, wählen Sie bei negativem Indexwert des Objekts einen SyncBlock aus dem SyncBlock-Cache aus und fügen Sie dessen Adresse in den Index des Objekts ein. Dies vervollständigt die vom Objekt markierte Sperre, und die anderen Threads wollen die Operation Monitor.Enter(object) erneut ausführen, was einen Index mit einem positiven Objekt bekommt, und dann warten. Bis der Index negativ wird, d. h. der Thread verwendet Monitor.Exit(object), um den Index negativ zu machen. Worauf Sie bei der Verwendung von Schloss achten sollten:
1. Sperre kann den Nullwert nicht sperren Ein Objekt kann auf Null zeigen, aber Null muss nicht freigegeben werden. (Siehe auch: Vollständiges Null verstehen) 2.lock kann den String-Typ nicht sperren, obwohl er ebenfalls ein Referenztyp ist. Weil der String-Typ vom CLR "schwebt" wird Das bedeutet, dass es nur eine Instanz eines bestimmten Strings im gesamten Programm gibt und dasselbe Objekt diesen Text in allen Threads aller laufenden Anwendungsdomänen darstellt. Daher sind alle Exemplare dieses Strings in der Anwendung gesperrt, solange eine Sperre auf eine Zeichenkette mit demselben Inhalt gesetzt wird. Daher ist es am besten, private oder geschützte Mitglieder zu sperren, die nicht getragen werden. 3. Locklock das Objekt ist die Speichergrenze eines Programmblocks 4. Der Werttyp kann nicht gesperrt werden, da das "Objekt freigegeben" im vorherigen Text in Rot steht und der Werttyp kein Referenztyp ist 5.Lock vermeidet das Sperren öffentlicher Typen oder Objekte, die nicht vom Programm gesteuert werden. Wenn die Instanz zum Beispiel öffentlich zugänglich ist, kann Lock(dies) problematisch sein, weil unkontrollierter Code das Objekt ebenfalls sperren kann. Dies kann zu Deadlocks führen, bei denen zwei oder mehr Threads darauf warten, dasselbe Objekt freizugeben. Das Sperren öffentlicher Datentypen (im Gegensatz zu Objekten) kann aus demselben Grund ebenfalls Probleme verursachen. Bei Verwendung von lock(this) kann der Wert der Klassenmitgliedsvariable durch die Methode geändert werden, die sich nicht in der kritischen Zone befindet
Anwendungsszenario: Es wird häufig verwendet, um unsichere Ausnahmen im Wert öffentlicher Variablen durch Multithread-Operationen zu verhindern, um die Sicherheit der Operationen zu gewährleisten
|