1. Warum sperren und was ist gesperrt?
Wenn wir Threads verwenden, ist der effizienteste Weg natürlich asynchron, das heißt, jeder Thread läuft zur gleichen Zeit, ohne aufeinander angewiesen zu sein und zu warten. Wenn jedoch verschiedene Threads auf eine bestimmte Ressource zugreifen müssen, ist ein Synchronisationsmechanismus erforderlich, das heißt, beim Lesen und Schreiben derselben Ressource muss die Ressource nur von einem Thread gleichzeitig betrieben werden, um sicherzustellen, dass jede Operation effektiv und unmittelbar ist, also die Atomität ihres Betriebs zu gewährleisten. lock ist die am häufigsten verwendete Synchronisationsmethode in C#, im Format lock(objectA){codeB}.
lock(objectA){codeB} scheint einfach, hat aber tatsächlich drei Bedeutungen, was für seine angemessene Verwendung unerlässlich ist: 1. Ist ObjektA gesperrt? Wenn nicht, sperre ich es, ansonsten warte, bis ObjektA freigegeben wird. 2. Nach der Sperrung können andere Threads codeB nicht aufrufen oder ObjectA während der Ausführung von CodeB verwenden. 3. Nach Ausführung von CodeB Release ObjectA und CodeB kann von anderen Threads genutzt werden.
2. Was ist mit dem Schloss passiert?
Schauen wir uns ein Beispiel an:
Im t1-Thread ruft LockMe lock(this), also c1 in der Hauptfunktion, auf, und beim Aufruf von lock(c1) im Hauptthread muss er warten, bis der Lock-Block in t1 ausgeführt ist, bevor auf c1 zugegriffen wird, das heißt, alle c1-bezogenen Operationen können nicht abgeschlossen werden, sodass wir sehen, dass selbst c1. DoNotLockMe() wird nicht ausgeführt.
|