Objekt integriertes Objekt

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 20
var 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

%0 object object toString() toJSON() Lock Lock new Lock() acquire() release() count() object->Lock Condition Condition Lock->Condition Event Event Lock->Event Semaphore Semaphore Lock->Semaphore

Konstrukteur

Lock

Konstrukteur

1
new Lock();

Mitgliedsfunktion

acquire

Übernehmen Sie den Besitz des Schlosses

1
Boolean 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

1
Lock.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

1
Integer 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.

1
String 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.

1
Value Lock.toJSON(String key = "");

Aufrufparameter:

  • key: Zeichenfolge, nicht verwendet

Rückgabeergebnisse:

  • Value, gibt einen Wert zurück, der JSON serialisierbar enthält