Objet objet intégré

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 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()

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

%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

Constructeur

Lock

Constructeur

1
new Lock();

fonction membre

acquire

Devenez propriétaire de la serrure

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

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

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

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

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