ObjectLock
Lock ist ein integriertes Objekt, mit dem der gleichzeitige Zugriff auf Fasern gesteuert werden kann. Sie können eine Sperre über eine Faser erwerben, um zu verhindern, dass andere Fasern sie gleichzeitig erhalten. Sperre kann passierencoroutine.Lock() Funktionserstellung
Eine häufige Situation besteht darin, dass in einem Multithread-Szenario Dateninkonsistenzen auftreten, wenn mehrere Threads dieselben Daten ändern möchten. Wenn beispielsweise zwei Threads denselben Wert in denselben Daten ändern möchten, können die Ergebnisse bei unsachgemäßer Steuerung inkonsistent sein. Zu diesem Zeitpunkt kann durch die Verwendung des Lock-Objekts ein gegenseitiger ausschließlicher Zugriff auf dieselben Daten erreicht werden.
Das Folgende ist ein einfaches Beispiel, in dem Lock verwendet wird, um die alternative Ausführung von zwei Fasern zu implementieren, und der Wert der gemeinsam genutzten Variablen v nicht 300 ist.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20var coroutine = require("coroutine")
var l = new coroutine.Lock()
var v = 100
function f() {
l.acquire()
v = 200
coroutine.sleep(1)
v = 300
l.release()
}
coroutine.start(f)
coroutine.sleep(1)
l.acquire()
assert.notEqual(300, v)
assert.equal(200, v)
l.release()
Zuerst wird ein Sperrobjekt erstellt, das in die Faser f eindringt, die Sperre erhält, die Variable v ändert und dann die Sperre aufhebt. Warten Sie im Hauptthread, bis die Faser f abgeschlossen ist ... Wenn die Faser f die Sperre aufhebt, beginnt der Hauptthread, die Sperre zu erwerben und sicherzustellen, dass der Wert der Variablen v auf 300 geändert wird.
Erbschaftsverhältnis
Konstrukteur
Lock
Konstrukteur
1new Lock();
Mitgliedsfunktion
acquire
Übernehmen Sie den Besitz des Schlosses
1Boolean Lock.acquire(Boolean blocking = true);
Aufrufparameter:
- blocking: Boolescher Wert, gibt an, ob gewartet werden soll. Warten, wenn wahr, der Standardwert ist wahr
Rückgabeergebnisse:
- Boolean, gibt zurück, ob die Sperre erfolgreich erworben wurde, true zeigt den erfolgreichen Erwerb an.
Die Acquire-Methode wird verwendet, um den Besitz der Sperre zu erlangen. Wenn sich die Sperre im erwerbbaren Zustand befindet, gibt diese Methode sofort „true“ zurück.
Wenn die Sperre nicht erworben werden kann und die Blockierung wahr ist, geht die aktuelle Faser in den Ruhezustand. Wenn andere Fasern die Sperre aufheben, gibt diese Methode „true“ zurück.
Wenn die Sperre nicht erworben werden kann und die Blockierung falsch ist, gibt die Methode „false“ zurück.
release
Geben Sie den Besitz des Schlosses frei
1Lock.release();
Diese Methode gibt den Besitz der Sperre frei oder löst einen Fehler aus, wenn die aktuelle Faser nicht Eigentümer der Sperre ist.
count
Fragen Sie die aktuelle Anzahl der wartenden Aufgaben ab
1Integer Lock.count();
Rückgabeergebnisse:
- Integer, gibt die Anzahl der Aufgaben zurück
toString
Gibt die Zeichenfolgendarstellung des Objekts zurück. Im Allgemeinen wird „[Native Object]“ zurückgegeben. Das Objekt kann gemäß seinen eigenen Eigenschaften neu implementiert werden.
1String Lock.toString();
Rückgabeergebnisse:
- String, gibt die Zeichenfolgendarstellung des Objekts zurück
toJSON
Gibt eine Darstellung des Objekts im JSON-Format zurück und gibt im Allgemeinen eine Sammlung lesbarer Eigenschaften zurück, die vom Objekt definiert werden.
1Value Lock.toJSON(String key = "");
Aufrufparameter:
- key: Zeichenfolge, nicht verwendet
Rückgabeergebnisse:
- Value, gibt einen Wert zurück, der JSON serialisierbar enthält