Wenn dein Code in einem Prozess ist, bei dem mehrere Threads gleichzeitig laufen, kann es sein, dass der Code gleichzeitig läuft. Wenn das Ergebnis jedes Durchlaufs dasselbe ist wie das eines einzelnen Threads und die Werte anderer Variablen wie erwartet gleich sind, ist es threadsicher. Mit anderen Worten: Die von einer Klasse oder einem Programm bereitgestellte Schnittstelle ist für Threads atomar, oder das Wechseln zwischen mehreren Threads führt nicht zu einer Mehrdeutigkeit im Ausführungsergebnis der Schnittstelle, was bedeutet, dass wir keine Synchronisation berücksichtigen müssen. Sicherheitsprobleme bei Threads werden sowohl durch globale als auch durch statische Variablen verursacht. Wenn jeder Thread nur Leseoperationen für globale und statische Variablen hat, aber im Allgemeinen keine Schreiboperationen, ist diese globale Variable threadsicher; Wenn mehrere Threads gleichzeitig Lese- und Schreiboperationen an einer Variablen durchführen, ist in der Regel eine Thread-Synchronisation erforderlich, andernfalls kann dies die Sicherheit der Threads beeinträchtigen.
Der Zweck von Lock ist es, gleichzeitige Operationen bei Multithread-Ausführung zu verhindern, und Objekte des Referenztyps des Locks erlauben jeweils nur einen Thread in seinem gesperrten Bereich.
Lock kann nur eine Referenztyp-Variable sperren, nämlich eine Adresse sperren
Es gibt einen Unterschied zwischen den Ergebnissen des Laufens mit und ohne Locking:
Nach der Sperrung: Der Wert von i wird nach und nach abnehmen, es gibt keine Sprünge, keine wiederholte Ausgabe, bis zum Wert von 0;
Kein Lock: Der Wertausgabe von i springt, wird diskontinuierlich abnehmend und kann auch einen Wert -1 haben;
Begründung: Nach dem Hinzufügen einer Sperre kann nur ein Thread den Code im gesperrten Bereich gleichzeitig ausführen, und beide Threads werden der Reihe nach ausgeführt, sodass es keine unterbrochene Ausgabe gibt. |