La sentencia lock toma el mutex de un objeto dado, ejecuta un bloque de sentencia y luego libera el bloqueo. Al sujetar un candado, el hilo que lo sujeta puede volver a adquirir y liberar el candado. Cualquier otro hilo está bloqueado para que se desbloquee el candado y espera hasta que se libere.
Revisión:
Usa el código de la cerradura
Equivalente a
Se puede pensar que el código subyacente de Lock está implementado por Monitor.
Como el código usa try... finalblock, así que incluso si se lanza una excepción en el cuerpo de la sentencia lock, el lock se libera.
No puedes usar el bloqueo de operador await en el cuerpo de la instrucción.No puedes usarlo en el cuerpo de la declaraciónEsperaBloqueo de operador。 No puedes usar el bloqueo de operador await en el cuerpo de la instrucción. No puedes usar el bloqueo de operador await en el cuerpo de la instrucción. ¡Esta frase es muy importante!
Documentación:El inicio de sesión del hipervínculo es visible.
Pruebo el código yo mismo,Usa Tarea para conseguir el bloqueo y usa Esperar para bloquear, el código es el siguiente:
Tras ejecutar el siguiente código varias veces, el resultado de ejecución no es el esperado.
¿Por qué? Si intentas usar la palabra clave await al intentar usar la palabra clave await en el bloque de bloqueo, obtendrás este error de compilación: cannot await en el cuerpo de una sentencia de bloqueo. La razón es que, tras completar await, el método puede ejecutarse en un hilo diferente en lugar del hilo (hilo que llama) antes de la palabra clave await.palabra clave locklockmismo hiloAbre el candado y suelta el candado en el candado。 Modifica el código para ver la razón de forma más intuitiva:
Obtén el id de rosca del candado y el id de rosca del desbloqueador del bloqueo,Obviamente no en un hilo, por lo que el candado no puede liberarse con éxito, como se muestra en la figura siguiente:
Probé a modificar el código, probé con hilos, ejecuté varias veces y funcionó como se esperaba, el código es el siguiente:
(Fin)
|