Bloqueo de obxectos
O bloqueo é un obxecto integrado que se pode usar para controlar o acceso simultáneo ás fibras. Podes adquirir un bloqueo a través dunha fibra para evitar que outras fibras o adquiran ao mesmo tempo. O bloqueo pode pasarcoroutine.Lock() creación de funcións
Unha situación común é que nun escenario multi-fíos, cando varios fíos queren modificar os mesmos datos, ocorrerá unha incoherencia de datos. Por exemplo, se dous fíos queren modificar o mesmo valor nos mesmos datos, os resultados poden ser inconsistentes se o control é incorrecto. Neste momento, o uso do obxecto Lock pode lograr un acceso mutuamente excluínte aos mesmos datos.
O seguinte é un exemplo sinxelo, usando Lock para implementar a execución alternativa de dúas fibras, e o valor da variable compartida 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()
En primeiro lugar, créase un obxecto Lock, entra na fibra f, adquire o bloqueo, modifica a variable v e despois libera o bloqueo. No fío principal, agarda a que se complete a fibra f... Cando a fibra f libera o bloqueo, o fío principal comeza a adquirir o bloqueo e asegura que o valor da variable v cambia a 300.
relación de herdanza
Construtor
Lock
Construtor
1new Lock();
función de membro
acquire
Obter a propiedade da pechadura
1Boolean Lock.acquire(Boolean blocking = true);
Parámetros de chamada:
- blocking: Booleano, especifica se esperar, esperar cando é verdadeiro, o predeterminado é verdadeiro
Resultados de devolución:
- Boolean, devolve se o bloqueo foi adquirido correctamente, verdadeiro indica que a adquisición foi exitosa.
O método de adquisición utilízase para obter a propiedade do bloqueo. Cando o bloqueo está no estado adquirible, este método devolve verdadeiro inmediatamente.
Cando o bloqueo non se pode adquirir e o bloqueo é verdadeiro, a fibra actual pasa a durmir. Cando outras fibras liberan o bloqueo, este método devolve verdadeiro.
Cando o bloqueo non se pode adquirir e o bloqueo é falso, o método devolve false.
release
Libera a propiedade do bloqueo
1Lock.release();
Este método liberará a propiedade do bloqueo ou producirá un erro se a fibra actual non posúe o bloqueo.
count
Consulta o número actual de tarefas en espera
1Integer Lock.count();
Resultados de devolución:
- Integer, devolve o número de tarefas
toString
Devolve a representación en cadea do obxecto. Polo xeral, devólvese "[Obxecto nativo]". O obxecto pódese volver implementar segundo as súas propias características.
1String Lock.toString();
Resultados de devolución:
- String, devolve a representación en cadea do obxecto
toJSON
Devolve unha representación en formato JSON do obxecto, devolvendo xeralmente unha colección de propiedades lexibles definidas polo obxecto.
1Value Lock.toJSON(String key = "");
Parámetros de chamada:
- key: Cadena, non usada
Resultados de devolución:
- Value, devolve un valor que contén JSON serializable