Objectvergrendeling
Slot is een ingebouwd object dat kan worden gebruikt om gelijktijdige toegang tot vezels te controleren. U kunt een slot verkrijgen via één vezel om te voorkomen dat andere vezels dit tegelijkertijd verkrijgen. Slot kan passerencoroutine.Lock() functiecreatie
Een veel voorkomende situatie is dat in een scenario met meerdere threads, wanneer meerdere threads dezelfde gegevens willen wijzigen, gegevensinconsistentie zal optreden. Als twee threads bijvoorbeeld dezelfde waarde in dezelfde gegevens willen wijzigen, kunnen de resultaten inconsistent zijn als het besturingselement onjuist is. Op dit moment kan het gebruik van het Lock-object wederzijds exclusieve toegang tot dezelfde gegevens bewerkstelligen.
Het volgende is een eenvoudig voorbeeld, waarbij Lock wordt gebruikt om alternatieve uitvoering van twee vezels te implementeren, en de waarde van de gedeelde variabele v is niet 300.
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()
Eerst wordt een Lock-object gemaakt, komt de vezel f binnen, verkrijgt de lock, wijzigt de variabele v en geeft vervolgens de lock vrij. Wacht in de hoofdthread tot de fiber f voltooid is... Wanneer de fiber f de Lock vrijgeeft, begint de hoofdthread de Lock te verwerven en ervoor te zorgen dat de waarde van de variabele v wordt gewijzigd in 300.
erfenis relatie
Constructeur
Lock
Constructeur
1new Lock();
lid functie
acquire
Word eigenaar van het slot
1Boolean Lock.acquire(Boolean blocking = true);
Oproepparameters:
- blocking: Booleaanse waarde, specificeert of er moet worden gewacht, gewacht wanneer waar, standaard is waar
Resultaten retourneren:
- Boolean, geeft terug of het slot met succes is verworven, waar geeft een succesvolle acquisitie aan.
Om het eigendom van het slot te verkrijgen wordt gebruik gemaakt van de acquire-methode. Wanneer het slot zich in de verkrijgbare staat bevindt, retourneert deze methode onmiddellijk true.
Wanneer het slot niet kan worden verkregen en de blokkering waar is, gaat de huidige vezel in de slaapstand. Wanneer andere vezels het slot vrijgeven, retourneert deze methode waar.
Wanneer de vergrendeling niet kan worden verkregen en de blokkering onwaar is, retourneert de methode onwaar.
release
Geef het eigendom van het slot vrij
1Lock.release();
Met deze methode wordt het eigendom van het slot vrijgegeven of wordt er een fout gegenereerd als de huidige glasvezel geen eigenaar van het slot is.
count
Vraag het huidige aantal wachtende taken op
1Integer Lock.count();
Resultaten retourneren:
- Integer, retourneert het aantal taken
toString
Retourneert de tekenreeksweergave van het object. Over het algemeen wordt '[Native Object]' geretourneerd. Het object kan opnieuw worden geïmplementeerd op basis van zijn eigen kenmerken.
1String Lock.toString();
Resultaten retourneren:
- String, retourneert de tekenreeksrepresentatie van het object
toJSON
Retourneert een weergave in JSON-indeling van het object, waarbij doorgaans een verzameling leesbare eigenschappen wordt geretourneerd die door het object zijn gedefinieerd.
1Value Lock.toJSON(String key = "");
Oproepparameters:
- key: Tekenreeks, niet gebruikt
Resultaten retourneren:
- Value, retourneert een waarde die JSON-serialiseerbaar bevat