Blocco oggetto
Lock è un oggetto integrato che può essere utilizzato per controllare l'accesso simultaneo alle fibre. È possibile acquisire un lock attraverso una fibra per impedire ad altre fibre di acquisirlo contemporaneamente. Il blocco può passarecoroutine.Lock() creazione di funzioni
Una situazione comune è che in uno scenario multi-thread, quando più thread desiderano modificare gli stessi dati, si verifica un'incoerenza dei dati. Ad esempio, se due thread desiderano modificare lo stesso valore negli stessi dati, i risultati potrebbero essere incoerenti se il controllo non è corretto. In questo momento, utilizzando l'oggetto Lock è possibile ottenere un accesso mutuamente esclusivo agli stessi dati.
Quello che segue è un semplice esempio di utilizzo di Lock per implementare l'esecuzione alternata di due fibre e il valore della variabile condivisa v non è 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()
Per prima cosa viene creato un oggetto Lock, entra nella fibra f, acquisisce il lock, modifica la variabile v, e poi rilascia il lock. Nel thread principale, attendere il completamento della fibra f... Quando la fibra f rilascia il Lock, il thread principale inizia ad acquisire il Lock e ad assicurarsi che il valore della variabile v venga modificato in 300.
rapporto ereditario
Costruttore
Lock
Costruttore
1new Lock();
funzione membro
acquire
Ottieni la proprietà della serratura
1Boolean Lock.acquire(Boolean blocking = true);
Parametri di chiamata:
- blocking: Booleano, specifica se attendere, attendere quando vero, il valore predefinito è vero
Risultati restituiti:
- Boolean, restituisce se il blocco è stato acquisito con successo, true indica l'acquisizione riuscita.
Il metodo acquire viene utilizzato per ottenere la proprietà del blocco. Quando il blocco è nello stato acquisibile, questo metodo restituisce immediatamente true.
Quando il blocco non può essere acquisito e il blocco è vero, la fibra corrente va in modalità sospensione. Quando altre fibre rilasciano il blocco, questo metodo restituisce vero.
Quando il blocco non può essere acquisito e il blocco è false, il metodo restituisce false.
release
Rilascia la proprietà della serratura
1Lock.release();
Questo metodo rilascerà la proprietà del blocco o genererà un errore se la fibra corrente non possiede il blocco.
count
Interroga il numero corrente di attività in attesa
1Integer Lock.count();
Risultati restituiti:
- Integer, restituisce il numero di attività
toString
Restituisce la rappresentazione in formato stringa dell'oggetto. Generalmente viene restituito "[Oggetto nativo]". L'oggetto può essere reimplementato in base alle proprie caratteristiche.
1String Lock.toString();
Risultati restituiti:
- String, restituisce la rappresentazione di stringa dell'oggetto
toJSON
Restituisce una rappresentazione in formato JSON dell'oggetto, generalmente restituendo una raccolta di proprietà leggibili definite dall'oggetto.
1Value Lock.toJSON(String key = "");
Parametri di chiamata:
- key: Stringa, non utilizzata
Risultati restituiti:
- Value, restituisce un valore contenente JSON serializzabile