|
La palabra clave lock marca un bloque de sentencias como zona crítica tomando un mutex para un objeto dado, ejecutando la sentencia y luego liberando el bloqueo.
La instrucción lock básicamente usa Monitor.Enter y Monitor.Exit, es decir, Monitor.Enter(this) se ejecuta cuando se ejecuta lock(this), y Monitor.Exit(this) se ejecuta al final del braquete. ¿Cuál es su significado? Para cualquier objeto, la primera parte de la memoria es la dirección de todos los métodos, y la segunda parte es un índice. Señala un SyncBlock en el área de caché SyncBlock del CLR. ¿Qué significa eso? Es decir, cuando ejecutas Monitor.Enter(Object), si el valor del índice del objeto es negativo, selecciona un SyncBlock de la caché de SyncBlock y coloca su dirección en el índice del objeto. Esto completa el bloqueo marcado por objeto, y los otros hilos quieren realizar de nuevo la operación Monitor.Enter(objeto), que obtendrá un índice con un objeto positivo, y luego esperar. Hasta que el índice se vuelve negativo, es decir, el hilo utiliza Monitor.Exit(objeto) para convertir el índice en negativo. A lo que debes prestar atención al usar la cerradura:
1.lock no puede bloquear el valor nulo Un objeto puede apuntar a nulo, pero no es necesario liberar nulo. (Véase también: Entendiendo el Nulo Completo) 2.lock no puede bloquear el tipo de cadena, aunque también es un tipo de referencia. Porque el tipo de cadena está "flotado" por el CLR Esto significa que solo hay una instancia de una cadena dada en todo el programa, y ese mismo objeto representa ese texto en todos los hilos de todos los dominios de aplicación en ejecución. Por lo tanto, mientras se coloque un bloqueo en una cadena con el mismo contenido en cualquier parte del proceso de aplicación, todas las instancias de esa cadena en la aplicación estarán bloqueadas. Por lo tanto, es mejor bloquear a miembros privados o protegidos que no se permitan persistir. 3. bloqueo El objeto es el límite de memoria de un bloque de programa 4. El tipo de valor no puede bloquearse, porque el "objeto se libera" en rojo en el texto anterior, y el tipo de valor no es un tipo de referencia 5.bloqueo evita bloquear tipos públicos u objetos que no están controlados por el programa. Por ejemplo, si la instancia es accesible públicamente, el bloqueo puede ser problemático porque el código no controlado también puede bloquear el objeto. Esto puede provocar bloqueos, donde dos o más hilos esperan para liberar el mismo objeto. Bloquear los tipos de datos públicos (en lugar de objetos) también puede causar problemas por la misma razón. Al usar lock(this), el valor de la variable miembro de clase puede cambiarse mediante el método que no está en la zona crítica
Escenario de aplicación: A menudo se utiliza para evitar excepciones inciertas en el valor de variables públicas causadas por operaciones multihilo para garantizar la seguridad de las operaciones
|