Verrouillage d'objet
Lock est un objet intégré qui peut être utilisé pour contrôler l'accès simultané aux fibres. Vous pouvez acquérir un verrou via une fibre pour empêcher d'autres fibres de l'acquérir en même temps. Le verrou peut passercoroutine.Lock() création de fonction
Une situation courante est que dans un scénario multithread, lorsque plusieurs threads souhaitent modifier les mêmes données, une incohérence des données se produit. Par exemple, si deux threads souhaitent modifier la même valeur dans les mêmes données, les résultats peuvent être incohérents si le contrôle est incorrect. À l'heure actuelle, l'utilisation de l'objet Lock peut obtenir un accès mutuellement exclusif aux mêmes données.
Ce qui suit est un exemple simple, utilisant Lock pour implémenter une exécution alternative de deux fibres, et la valeur de la variable partagée v n'est pas 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()
Tout d'abord, un objet Lock est créé, entre dans la fibre f, acquiert le verrou, modifie la variable v, puis libère le verrou. Dans le thread principal, attendez que la fibre f se termine... Lorsque la fibre f libère le verrou, le thread principal commence à acquérir le verrou et s'assure que la valeur de la variable v passe à 300.
relation d'héritage
Constructeur
Lock
Constructeur
1new Lock();
fonction membre
acquire
Devenez propriétaire de la serrure
1Boolean Lock.acquire(Boolean blocking = true);
Paramètres d'appel :
- blocking: Booléen, spécifie s'il faut attendre, attendre quand vrai, la valeur par défaut est vrai
Résultats de retour :
- Boolean, indique si le verrou a été acquis avec succès, true indique une acquisition réussie.
La méthode d'acquisition est utilisée pour obtenir la propriété du verrou. Lorsque le verrou est dans l'état acquérable, cette méthode renvoie immédiatement true.
Lorsque le verrou ne peut pas être acquis et que le blocage est vrai, la fibre actuelle se met en veille. Lorsque d'autres fibres libèrent le verrou, cette méthode renvoie vrai.
Lorsque le verrou ne peut pas être acquis et que le blocage est faux, la méthode renvoie faux.
release
Libérer la propriété de la serrure
1Lock.release();
Cette méthode libérera la propriété du verrou ou générera une erreur si la fibre actuelle ne possède pas le verrou.
count
Interroger le nombre actuel de tâches en attente
1Integer Lock.count();
Résultats de retour :
- Integer, renvoie le nombre de tâches
toString
Renvoie la représentation sous forme de chaîne de l'objet. Généralement, "[Native Object]" est renvoyé. L'objet peut être réimplémenté en fonction de ses propres caractéristiques.
1String Lock.toString();
Résultats de retour :
- String, renvoie la représentation sous forme de chaîne de l'objet
toJSON
Renvoie une représentation au format JSON de l'objet, renvoyant généralement une collection de propriétés lisibles définies par l'objet.
1Value Lock.toJSON(String key = "");
Paramètres d'appel :
- key: Chaîne, non utilisée
Résultats de retour :
- Value, renvoie une valeur contenant du JSON sérialisable